Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 潜在异步函数返回一个立即解决的承诺?_Javascript_Promise - Fatal编程技术网

Javascript 潜在异步函数返回一个立即解决的承诺?

Javascript 潜在异步函数返回一个立即解决的承诺?,javascript,promise,Javascript,Promise,其中asyncbanarequest返回一个承诺- function potentiallyAsync () { if (cachedBanana) { return asyncBananaRequest(); } return ??cachedBanana??; } potentiallyAsync().then(function(banana){ //use banana }) 我想要一个香蕉,我可能已经把它缓存起来了。有没有一种方法可以让我将缓存的香蕉返回到潜在

其中
asyncbanarequest
返回一个承诺-

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

potentiallyAsync().then(function(banana){
  //use banana
})
我想要一个香蕉,我可能已经把它缓存起来了。有没有一种方法可以让我将缓存的香蕉返回到潜在的同步功能中,这是一种立即解决缓存香蕉问题的承诺


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

当然!使用以下线条的图案:

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

虽然有些小猫很可怕,但他的回答使用了

我建议如下:

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发出通知时在绝对端点使用。

同样重要的是,AsyncBanaRequest不能同步抛出。另请参阅