当前位置: 首页 > 面试题库 >

JavaScript什么是显式的Promise构建反模式,如何避免呢?

洪德寿
2023-03-14
问题内容

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

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 构造函数反模式
”,这段代码有什么不好之处,为什么又将其称为反模式?


问题答案:

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

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

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

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

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

报价Esailija:

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



 类似资料:
  • 问题内容: GoF的原始Builder模式与Joshua Bloch的“修订的GoF Builder模式”之间有什么区别? 问题答案: GoF模式着重于抽象化构造步骤,这样,通过更改构建器,您可以得到不同的结果,而“经修订的构建器”则针对由多个构造器添加的不必要的复杂性问题。因此,GoF模式更多地是关于抽象,而修订后的模式更多地是关于简单性(IMO)。 看一下http://en.wikipedia

  • 问题内容: 我通过遵循一些pygame教程来学习Python 。 在其中我发现了关键字 self的 广泛使用,并且主要来自Java背景,我发现自己一直忘记键入 self 。例如,代替我输入,因为对我来说, rect 已经是该类的成员变量。 Java的并行的我能想到的这种情况是有前缀成员变量的所有引用与 此 。 我是否在所有成员变量前面都加上了 self 前缀,还是有一种方法可以声明它们,而不必这样

  • 本文向大家介绍什么是FOUC?你是如何避免FOUC的?相关面试题,主要包含被问及什么是FOUC?你是如何避免FOUC的?时的应答技巧和注意事项,需要的朋友参考一下 FOUC:加载时样式突然变化 原因:由于在渲染HTML时,遇到CSS样式表会重新渲染HTML 样式表没有放到head里面 使用了@import导入样式 解决:尽量把样式表放到body标签上面

  • 我正在尝试使用Promise API编写重新连接到超时数据库的代码。 我最后做的是把连接DB的promise包装成一个promise,但我不确定这是否是最好的方式。我想可能有一种方法可以使用最初的promise,从尝试连接到数据库,但我无法找到它。 我认为没有setTimeout块是可能的,但我无法解决它。

  • 本文向大家介绍什么是 XSS 攻击,如何避免?相关面试题,主要包含被问及什么是 XSS 攻击,如何避免?时的应答技巧和注意事项,需要的朋友参考一下 XSS 攻击:即跨站脚本攻击,它是 Web 程序中常见的漏洞。原理是攻击者往 Web 页面里插入恶意的脚本代码(css 代码、Javascript 代码等),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的,如盗取用户 coo

  • 本文向大家介绍什么是 CSRF 攻击,如何避免?相关面试题,主要包含被问及什么是 CSRF 攻击,如何避免?时的应答技巧和注意事项,需要的朋友参考一下 CSRF:Cross-Site Request Forgery(中文:跨站请求伪造),可以理解为攻击者盗用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件、发消息、购买商品,虚拟货币转账等。 防御手段: 验证请求来源地址; 关键操作添加验