潜在的异步函数会返回一个立即解析的承诺吗?

时间:2014-03-26 03:45:26

标签: javascript promise

asyncBananaRequest返回承诺的地方 -

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

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

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

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

2 个答案:

答案 0 :(得分:7)

虽然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)来创造新的承诺是承诺的面包和黄油。在宣传基于回调的API时,只应在绝对端点使用延迟对象。

答案 1 :(得分:1)

当然!沿着这些方向使用模式:

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!
   });
}