我有一个返回promise的异步函数。在第一次完成该功能时,我正在缓存响应。在后续调用中,如果缓存响应可用,我希望使用它。我如何构建实现此行为的承诺?
这样的事情会起作用吗?
if(this.cachedResult) {
return $q(function(resolve, reject) {
resolve(this.cachedResult);
}).then(success.bind(this));
}
return this.myService.getSomethingAsync()
.then(success.bind(this))
.fail(fail);
答案 0 :(得分:4)
嗯,这会有点工作。
可能很容易:
if(this.cachedResult) {
return $q.when(this.cachedResult)
}
var that = this
return getFromService().then(function(res){
that.cachedResult = res
return res;
})
而不是构造函数位。虽然这打开了比赛条件的大门(如果在你等待第一个结果的同时提出5次请求怎么办?将提出五个请求。
所以最好缓存承诺:
var cache = null
function myFunction(){
return cache || (cache = getFromService())
}
哪个更短,更优雅,更不容易出现竞争条件。