我写的代码看起来像:

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构造函数反模式”,这段代码有什么不好的地方,为什么称为antipattern

最佳答案

deferred antipattern (now explicit-construction anti-pattern)创造的Esailija是一个常见的反模式的人谁是新的承诺作出,我自己做的时候,我第一次使用承诺。上述代码的问题在于未能利用承诺链这一事实。
承诺可以与.then链接,您可以直接返回承诺。getStuffDone中的代码可以重写为:

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

承诺都是为了使异步代码更具可读性,表现得像同步代码,而不隐藏这一事实。承诺表示对一次性操作值的抽象,它们抽象了编程语言中语句或表达式的概念。
您应该只在converting an API to promises且无法自动执行时使用延迟对象,或者在编写更容易以这种方式表示的聚合函数时使用延迟对象。
引用伊萨利娅的话:
这是最常见的反模式。当您不真正理解承诺并将其视为美化的事件发射器或回调实用程序时,很容易陷入这种情况。让我们回顾一下:承诺是让异步代码保留同步代码丢失的大部分属性,比如平缩进和一个异常通道。

10-06 11:39