我编写的代码看起来像: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构造函数反模式 ”,这个代码有什么不好,为什么这被称为反模式?
2 回答
ibeautiful
TA贡献1993条经验 获得超5个赞
Esailija创造的延迟反模式(现在是明确构建的反模式)是一种常见的反模式人物,他们是新的承诺,我在我第一次使用承诺时自己创造了。上述代码的问题在于无法利用promises链的事实。
承诺可以链接,.then
你可以直接返回承诺。您的代码getStuffDone
可以重写为:
function getStuffDone(param){ return myPromiseFn(param+1); // much nicer, right?}
Promise都是为了使异步代码更具可读性,并且表现得像同步代码而不隐藏这一事实。Promise表示对一次操作的值的抽象,它们在编程语言中抽象出语句或表达式的概念。
在将API转换为promises并且无法自动执行时,或者当您编写更容易表达的聚合函数时,您应该只使用延迟对象。
引用Esailija:
这是最常见的反模式。当你不真正理解承诺并将它们视为美化事件发射器或回调实用程序时,很容易陷入这种情况。让我们回顾一下:promises是关于使异步代码保留同步代码的大部分丢失属性,例如扁平缩进和一个异常通道。
添加回答
举报
0/150
提交
取消