我正在编写代码,它看起来像:
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 构造函数反模式”,这段代码有什么不好的,为什么这叫做反模式?
Promise
Esailija创造的延迟反模式(现在是显式构造反模式)是一种常见的反模式,人们对 Promise 不熟悉,我第一次使用 Promise时就自己做了。上面代码的问题是没有利用承诺链的事实。
Promise 可以链接,.then你可以直接返回 Promise。您的代码getStuffDone可以重写为:
.then
getStuffDone
function getStuffDone(param){ return myPromiseFn(param+1); // much nicer, right? }
Promise 都是关于使异步代码更具可读性并且表现得像同步代码而不隐藏这一事实。Promise 表示对一次性操作值的抽象,它们抽象了编程语言中语句或表达式的概念。
仅当您将 API 转换为 Promise且无法自动执行此操作时,或者当您编写更容易以这种方式表达的聚合函数时,才应使用延迟对象。
引用 Esailija 的话:
这是最常见的反模式。当您不真正理解 Promise 并将它们视为美化的事件发射器或回调实用程序时,很容易陷入这种情况。让我们回顾一下:promise 是关于让异步代码保留同步代码的大部分丢失属性,例如扁平缩进和一个异常通道。