【问题标题】:Avoiding the deferred anti-pattern [duplicate]避免延迟的反模式[重复]
【发布时间】:2015-04-30 02:42:16
【问题描述】:

我有一些看起来像这样的代码:

function foo() {

    var deferred;

    deferred = q.defer();

    doSomethingAsync()
        .then(function(result) {
            var resultTransformed = doSomethingSynchronousToTheResult(result);
            deferred.resolve(resultTransformed);
        });

    return deferred.promise;

};

也许:

function foo() {            
    return doSomethingAsync()
        .then(function(result) {
            return doSomethingSynchronousToTheResult(result);
        });       
};

以上内容能否确保转换后的结果在承诺链的下游使用得更远?

如何重构它以避免延迟反模式?

【问题讨论】:

  • 我认为这个问题已经在规范帖子中得到处理,不是吗? return doSomethingAsync().then(doSomethingSynchronousToTheResult) 只是那里建议的解决方案。

标签: javascript promise


【解决方案1】:

当创建新的冗余延迟对象以从承诺链内部解决时,就会发生延迟反模式。

在你的情况下,你已经有一个 Promise 对象,所以你只需要返回 doSomethingAsync() 结果:

function foo() {
    return doSomethingAsync().then(function (result) {
        return doSomethingToTheResult(result);
    });
};

以上内容是否能确保转换后的结果在承诺链的下游使用得更远?

是的,没错,这是关于 Promise 最酷的事情之一。

【讨论】:

  • 但是如果 doSomethingToTheResult 是异步的并且不是基于 promise 的,我确实需要创建一个新的 deferred。对吗?
  • 如果 doSomethingToTheResult 是异步的,那么是的,在里面你需要创建 deferred 并返回 promise。
  • @BenAston 要么,或者你可以使用promise构造函数创建一个promise。
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 2012-02-03
相关资源
最近更新 更多