为了账号安全,请及时绑定邮箱和手机立即绑定

什么是明确的承诺构建反模式,我该如何避免它?

什么是明确的承诺构建反模式,我该如何避免它?

慕森王 2019-05-20 16:02:20
我编写的代码看起来像: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是关于使异步代码保留同步代码的大部分丢失属性,例如扁平缩进和一个异常通道。


查看完整回答
反对 回复 2019-05-20
  • 2 回答
  • 0 关注
  • 626 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信