使用$ q.race为$ q promise提供超时

时间:2017-05-21 09:04:17

标签: javascript angularjs promise angular-promise

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

我试图找出如何对此承诺执行超时以拒绝他,但我发现的唯一事情是如何对$http函数执行超时。

提前致谢并对我的英语表示抱歉。

1 个答案:

答案 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承诺。当您处理可能会或可能不是承诺的对象,或者承诺来自不可信任的来源时,这非常有用。

     

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