我遇到了Angular(1.4)服务的一些问题。代码大致如下:
service.retrieveStuffFromServer = function() {
return httpCallFromServer().then(
function(data) {
if (Array.isArray(data)) {
return data;
}
return [];
}
);
};
我在两个不同的控制器中调用此函数。大多数时候,它按预期工作,但我在这些条件下遇到问题:
我的第一个猜测是略微改变服务,通知任一控制器服务是否已经忙,所以我可以稍后重试,但我不确定这是否是最佳解决方案,所以我&# 39;我正在寻找一些建议。
答案 0 :(得分:0)
很难说为什么它不仅仅起作用,但可能是httpCall()
中的某些内容阻止了在第一个调用完成之前再次进行相同的调用,并且如果发生这种情况则它会拒绝。但是,如果您希望控制器B调用共享来自活动的先前调用的响应,则可以缓存该承诺:
function myFunction() {
if (!myFunction.promise) {
myFunction.promise = httpCall()
.then(function(result) {
myFunction.promise = undefined;
return ...
}, function(err) {
myFunction.promise = undefined;
throw err;
});
}
return myFunction.promise;
}
只要先前的呼叫仍未解决,这将导致先前呼叫的相同承诺被返回。
使用函数本身的属性作为缓存是一种方便的方法,可以使状态与函数本身保持逻辑关联。您可以使用myFunction
范围之外定义的任何变量。