使用 $q.race 向$q承诺添加超时



我有一个返回$q.defer().promise的函数。 在其他函数中,我调用此函数并then此承诺。

我试图找出如何在这个承诺上做超时以拒绝他,但我唯一发现的是如何对$http函数做超时。

提前感谢,对不起我的英语。

要创建可以从另一个承诺超时的承诺,请使用 $q.race

var dataPromise = service.getData();
var timeoutPromise = $timeout(function(){}, 2000);
timeoutPromise = timeoutPromise
.then(function() {
return $q.reject("Timeout");
});
var dataOrTimeoutPromise = $q.race([dataPromise, timeoutPromise]);

上面的示例创建了一个承诺,该承诺将在 2000 毫秒后使用数据解析或以"超时"的原因拒绝,以先到者为准。

有关更多信息,请参阅 AngularJS $q Service API 参考 ($q.race)


这看起来不错,但我使用角度 1.5.7 并在角度 1.5.8 中添加了此功能。Promise.race也会做同样的事情,或者我应该像这里一样$q.race()旧的角度版本中实现这种方法。

如果您使用Promise.race,请务必将其转换为带有 $q.when 的$q承诺:

var dataOrTimeoutPromise = $q.race([dataPromise, timeoutPromise]);
//OR
var dataOrTimeoutPromise = $q.when(Promise.race([dataPromise, timeoutPromise]));

AngularJS通过提供自己的事件处理循环来修改正常的JavaScript流。这将JavaScript分为经典和AngularJS执行上下文。只有在 AngularJS 执行上下文中应用的操作才能从 AngularJS 数据绑定、异常处理、属性监视等中受益。使用$q.when将 ES6 承诺引入 AngularJS 执行上下文。

从文档中:

$q.何时

将可能是值或(第三方)当时可承诺的对象包装为$q承诺。当您处理的对象可能是也可能不是承诺时,或者如果承诺来自不可信的源,这很有用。

— AngularJS $q Service API Reference (q.when)

最新更新