什么是显式promise构造反模式,如何避免呢?

Itachi · 05月25日

我正在编写代码,执行以下操作:

function getStuffDone(param) {           | function getStuffDone(param) {
    var d = Q.defer(); /* or $q.defer */ |     return new Promise(function(resolve, reject) {
    // or = new $.Deferred() etc.        |     // using a promise constructor
    myPromiseFn(param+1)                 |         myPromiseFn(param+1)
    .then(function(val) { /* or .done */ |         .then(function(val) {
        d.resolve(val);                  |             resolve(val);
    }).catch(function(err) { /* .fail */ |         }).catch(function(err) {
        d.reject(err);                   |             reject(err);
    });                                  |         });
    return d.promise; /* or promise() */ |     });
}                                        | }

有人告诉我这分别称为“ 延迟反模式 ”或“ Promise构造函数反模式 ”,这段代码有什么不好之处,为什么又将其称为反模式

回答(1)
时间
J
JinJin
1 · 2020-05-25 11:57:29

Esailija创造递延反模式(现在是显式构造反模式)是一个新的对诺言做出承诺的普通反模式人,当我第一次使用诺言时,我自己就做出了。上面代码的问题是无法利用承诺链的事实。

承诺可以与之连锁,.then您可以直接返回承诺。您的代码getStuffDone可以重写为:

function getStuffDone(param){
    return myPromiseFn(param+1); // much nicer, right?
}

承诺都是关于使异步代码更具可读性,并且在不隐藏该事实的情况下像同步代码一样起作用。承诺表示对一次操作值的抽象,它们抽象出一种编程语言中的语句或表达式的概念。

仅在将API转换为Promise且无法自动执行时,或者在编写以这种方式表示的聚合函数时,才应使用延迟对象

引用Esailija:

这是最常见的反模式。当您不真正理解承诺并将其视为荣耀的事件发射器或回调实用程序时,很容易陷入这种情况。让我们回顾一下:承诺是关于使异步代码保留同步代码的大部分丢失属性,例如平面缩进和一个异常通道。

你的回答

加载中...
⌘+Return 发表
发表

温馨提示:登录后可发表评论或回复

关闭,朕知道了

扫码关注微信公众号或小程序