我写的代码是这样的:

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() */ |     });
}                                        | }

有人告诉我,这分别被称为"deferred antipattern"或"101 constructor antipattern",这段代码有什么不好,为什么被称为antipattern

推荐答案

Esailija创造的deferred antipattern (now explicit-construction anti-pattern)是一种常见的反模式的人,他们是promise 的新手,我第一次使用promise 的时候就自己做的.上述代码的问题在于,它没有利用promise 链这一事实.

promise 可以与.then连锁,您可以直接返回promise .您在getStuffDone中的代码可以重写为:

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

promise 的全部目的是使异步代码更具可读性,并在不隐瞒这一事实的情况下像同步代码一样工作.promise 表示对一次性操作的值的抽象,它们抽象了编程语言中的语句或表达式的概念.

只有当您converting an API to promises岁且无法自动执行时,或者当您正在编写更容易用这种方式表达的聚合函数时,才应该使用延迟对象.

引用Esailija的话:

这是最常见的反模式.当你不真正理解promise 时,很容易陷入这种境地,把它们看作是美化的事件emits 器或回调工具.让我们回顾一下:promise 是让异步代码保留同步代码丢失的大部分属性,比如平面缩进和一个异常通道.

Javascript相关问答推荐

IOS(React Native)中未找到模块SquareReaderSDK

将下拉分区与工具提示结合起来

二维数组,过滤并返回带有索引而不是值的新数组

如何制作删除按钮以从列表中删除该项目所属的项目?

为什么我的第二个OnClick Isloading值在TEK查询Mutations 查询中不起作用?

ReactJS中的material UI自动完成类别

深嵌套的ng-container元素仍然可以在Angular 布局组件中正确渲染内容吗?

Google Apps脚本中的discord邀请API响应的日期解析问题

google docs boldText直到按行执行应用脚本错误

使用useEffect,axios和useParams进行react测试

Promise Chain中的第二个useState不更新

当Redux提供程序访问Reduxstore 时,可以安全地从Redux提供程序外部调用钩子?

使用ThreeJ渲染的形状具有抖动/模糊的边缘

类构造函数不能在没有用With Router包装的情况下调用

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

在数组中查找重叠对象并仅返回那些重叠对象

使用VUE和SCSS的数字滚动动画(&;内容生成)

未加载css colored颜色 ,无法将div设置为可见和不可见

获取';无法解决导入和导入";slick-carousel/slick/slick-theme.css";';错误

使用自动识别发出信号(&Q)