asyncBananaRequest
返回承诺的地方 -
function potentiallyAsync () {
if (cachedBanana) {
return asyncBananaRequest();
}
return ??cachedBanana??;
}
potentiallyAsync().then(function(banana){
//use banana
})
我想要一个香蕉,我可能已经将它缓存了。有没有办法让我在potentialAsync函数中返回缓存的香蕉作为一个立即用缓存的香蕉解决的承诺?
我目前正在使用Angular中打包的Q lib,但我希望这是一个通用的实现
答案 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!
});
}