Javascript &引用;“允诺”;缓存的响应

Javascript &引用;“允诺”;缓存的响应,javascript,promise,q,Javascript,Promise,Q,我有一个异步函数,它返回一个承诺。在函数第一次完成时,我将缓存响应。在随后的调用中,如果缓存的响应可用,我希望使用它。我怎样才能做出承诺来实现这种行为 你喜欢这个工作吗 if(this.cachedResult) { return $q(function(resolve, reject) { resolve(this.cachedResult); }).then(success.bind(this)); } return this.myService.getSo

我有一个异步函数,它返回一个承诺。在函数第一次完成时,我将缓存响应。在随后的调用中,如果缓存的响应可用,我希望使用它。我怎样才能做出承诺来实现这种行为

你喜欢这个工作吗

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

嗯,那会很有效的

这很容易:

if(this.cachedResult) {
    return $q.when(this.cachedResult)
}
var that = this
return getFromService().then(function(res){
    that.cachedResult = res
    return res;
})
而不是构造函数位。虽然这为比赛条件打开了大门(如果在等待第一个结果时请求了5次,会怎么样?会有5次请求

因此,最好将承诺缓存起来:


它既短,更优雅,也不太容易受到比赛条件的影响。

好吧,它会起作用的

这很容易:

if(this.cachedResult) {
    return $q.when(this.cachedResult)
}
var that = this
return getFromService().then(function(res){
    that.cachedResult = res
    return res;
})
而不是构造函数位。虽然这打开了竞争条件的大门(如果在等待第一个结果时请求被发出5次会怎么样?将发出5次请求)

因此,最好将承诺缓存起来:


这是我如何使用jQuery的承诺的:也许它可以帮助我使用一个memoize函数这是我如何使用jQuery的承诺的:也许它可以帮助我使用一个memoize函数h,整洁的想法。在缓存的承诺被返回的情况下,承诺何时被解析ed?或者换句话说,是什么触发了承诺的解析,因为我希望每次调用都重新解析它,但使用缓存数据(如果可用)。@Ben:承诺不是“重新解析”(只能解析一次),但它仍然允许您在解析后添加新的处理程序(然后自动调用结果)。解析由
getFromService()中的任何内容触发
在最初的调用中是这样做的。啊,好主意。在返回缓存的承诺的情况下,承诺何时得到解决?或者换句话说,是什么触发承诺的解决,因为我希望每次调用都重新解决它,但使用缓存的数据(如果可用)。@Ben:承诺不是“重新解决”的(它只能被解析一次),但它仍然允许您在解析后添加新的处理程序(并自动调用它们并给出结果)。解析由原始调用中的
getFromService()
触发。