【问题标题】:Using $q.race to add a timeout to a $q promise使用 $q.race 为 $q 承诺添加超时
【发布时间】:2017-10-21 01:25:22
【问题描述】:

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

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

在此先感谢,对我的英语感到抱歉。

【问题讨论】:

  • 到目前为止您尝试过什么?请添加一些代码
  • 提示:Promise.race
  • github.com/kriskowal/q/wiki/… 如果你有一个 Q 承诺,有一个 timeout 方法
  • 适用于$q 承诺? @JaromandaX
  • 我不使用这个Q promise @Sheng​​span>

标签: javascript angularjs promise angular-promise


【解决方案1】:

要创建一个可以从另一个 Promise 超时的 Promise,请使用 $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 Reference ($q.race)


这看起来不错,但我使用 angular 1.5.7 并且在 angular 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

将一个可能是值或(第 3 方)then-able 承诺的对象包装到 $q 承诺中。当您处理的对象可能是也可能不是 Promise 时,或者当 Promise 来自不可信的来源时,这很有用。

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

【讨论】:

  • 这看起来不错,但我使用 angular 1.5.7 并且在 angular 1.5.8 中添加了此功能。 Promise.race 会做同样的事情,或者我应该像这里一样实现这个方法:stackoverflow.com/questions/39489360/…
猜你喜欢
  • 2015-02-25
  • 1970-01-01
  • 2015-04-08
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2016-06-25
  • 1970-01-01
相关资源
最近更新 更多