我有一个返回$q.defer().promise
的函数。
在其他函数中,我调用此函数并对此承诺执行then
。
我试图找出如何对此承诺执行超时以拒绝他,但我发现的唯一事情是如何对$http
函数执行超时。
提前致谢并对我的英语表示抱歉。
答案 0 :(得分:1)
要创建可以从其他承诺超时的承诺,请使用$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]);
上面的示例创建了一个承诺,它将解析数据或拒绝原因" Timeout"在2000毫秒后,以先到者为准。
有关详细信息,请参阅AngularJS $q Service API Reference ($q.race)
这看起来不错但是我使用了角1.5.7并且这个功能在角1.5.8中添加了。
Promise.race
也会这样做,或者我应该像$q.race()
in old angular versions一样实施此方法。
如果您使用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.when
将可能是值的对象或(第三方)包装成$ q承诺。当您处理可能会或可能不是承诺的对象,或者承诺来自不可信任的来源时,这非常有用。