【问题标题】:Angularjs $q run in sequencesAngularjs $q 按顺序运行
【发布时间】:2017-04-23 09:25:34
【问题描述】:

遇到了 angularjs 和一些承诺的问题。出于某种原因,我的服务混合了查询的答案,虽然服务是固定的,但我需要将我的 $q.all() 更改为,而不是异步运行所有承诺,然后按顺序运行。

现在,它看起来像这样:

var promises = [p1, p2, p3];

$q.all(promises).then(function () {
    // All promises are done
}).catch(function (exception) {
    // An error occured.
});

预期的行为应该像p1.then(p2).then(p3);,顺序无关紧要(因为通常运行异步)。数组长度是可变的。

由于 $q 受到 Q lib 的启发,我查看了 Q 文档并找到了 a sequence reference,但无法使其与 $q 一起使用。

任何人都可以为此类问题推荐一个简单的解决方案吗?

我确实试过这个promises.reduce($q.when, $q(initialVal));,但不明白initialVal指的是什么:(

感谢您的阅读,祝您有愉快的一天。

【问题讨论】:

  • 需要触发这些异步请求。因此,首先将这些功能分组并按优先级排序。接下来,连接每个 resolve 以触发下一个函数。我只会创建您自己的服务来执行此操作。
  • 是的,我的第一个想法是使用递归函数来触发第一个函数,然后弹出数组并在成功后再次调用。不是很多编码,但不是真正的 js 风格,我很害怕。如果我没有答案,我会自己做一些事情并在这里发布(添加在 $q 原型中以便于重复使用)
  • initialValue 是数组中第一个异步函数的输入,除了,我认为你不需要$q
  • 见鬼,抱歉重复...不知道为什么我找不到它:(

标签: javascript angularjs angular-promise


【解决方案1】:

如果你已经有了 Promise,那么异步方法就已经被触发了!您必须一个一个地触发它们,因此您的数组需要包含返回 Promise 而不是 Promise 对象的函数。

然后你可以这样去做,这比你在问题中提供的 Q 的快捷方式对我来说更清楚:

var promiseReturningFunctions = [p1, p2, p3];
var queueEntryPoint = $q.defer();
// create a waiting queue
var queue = queueEntryPoint.promise;
// this queues up the asynchronous functions
promiseReturningFunctions.forEach(function (p) {
    queue = queue.then(p);
});
// here we start processing the queue by resolving our queueEntryPoint
queueEntryPoint.resolve();
// we can now use queue.then(...) to do something after all promises in queue were resolved
queue.then(function () {
    // All promises are done
}).catch(function (exception) {
    // An error occured.
});

【讨论】:

  • promiseReturningFunctions 在哪里使用?
  • 我的错,我为了更好的教学而更改了变量名并遗漏了一个,请参阅我的编辑。
  • 看起来不错。可以使用“$q.when()”添加已解析的入口点。并且它需要额外的措施来提供对象方法作为“then”回调。
  • 插入到初始数组的实体必须注意正确的绑定,如果异步回调函数foo.bar使用this,那么你只需将它添加到数组中@ 987654325@。我认为没有真正的理由投反对票。
  • 好的,在我的情况下它真的很好用,非常感谢你的帮助;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多