【问题标题】:Potentially async function return a promise that immediately resolves?潜在的异步函数返回一个立即解决的承诺?
【发布时间】:2014-03-26 03:45:25
【问题描述】:

asyncBananaRequest 返回一个承诺 -

function potentiallyAsync () {
  if (cachedBanana) {
    return asyncBananaRequest();
  }
  return ??cachedBanana??;
}

potentiallyAsync().then(function(banana){
  //use banana
})

我想要一个香蕉,我可能已经缓存了它。有没有办法让我在可能的异步函数中返回缓存的香蕉作为立即用缓存的香蕉解决的承诺?

我目前正在使用打包在 Angular 中的 Q lib,但我希望有一个通用的实现

【问题讨论】:

标签: javascript promise


【解决方案1】:

虽然 SomeKittens 很棒,但他的回答使用了deferred anti pattern

我建议如下:

function potentiallyAsync () {
  return (cachedBanana) ? Promise.resolve(cachedBanana) : asyncBananaRequest();
}

potentiallyAsync().then(function(banana){
  //use banana
});

在 Angular 的 $q 中,您只能使用完全相同的东西 $q.when(cachedBanana) 而不是 ES6 标准 Promise.resolve

这种形式的链接和使用 .resolve (.when in $q) 来创建新的 Promise 是 Promise 的基础。在承诺基于回调的 API 时,只能在绝对端点处使用延迟对象。

【讨论】:

  • 另外需要提一下 - asyncBananaRequest 不能同步抛出。
【解决方案2】:

当然!使用遵循以下原则的模式:

function bananas($q) {
  var def = $q.defer();

  if (cachedBananas) {
    def.resolve(cachedBananas);
  } else {
    asyncBananas('Monkey.co')
    .success(function(bananas) {
      def.resolve(bananas);
    });
  }

  return def.promise;
}

同时:

function monkey(bananas) {
   bananas.then(function(bananas) {
     bananas.eat(); // Yum!
   });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2022-01-26
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多