【问题标题】:Node how to do something after an nested async for loop is completed.节点在嵌套的异步 for 循环完成后如何做某事。
【发布时间】:2014-12-14 22:44:36
【问题描述】:

我(正如我通常必须做的那样)与 Node.js 的异步特性搏斗。

我的问题是我正在编写一个抓取脚本,它获取一些数据,基于该数据,获取更多数据,基于该数据获取更多数据,然后基于该数据执行大量操作。我的问题是,我想在所有这些过程都完成后做某事,但我完全不知道如何做。

在某个范围内。

(function () {
    getData(function (things) {
        things.forEach(function (thing) {
            getOtherData(thing, function (otherThings) {
                otherThings.forEach(function (otherThing) {
                    getSomeMoreData(thing, otherThing, function (anotherThings) {
                        anotherThings.forEach(function (anotherThing) {
                            getEvenMoreData(thing, otherThing, anotherThing, function (somethingElses) {
                                somethingElses.forEach(function (somethingElse) {
                                    doSomething(somethingElse);
                                });
                            });
                        });
                    });
                });
            });
        });
    });
}());

所以我想在整个过程完成后做点什么。

有人对如何做到这一点有任何建议吗?

请注意,所有 'get' 或 'do' 方法都有 IO。

【问题讨论】:

  • 您将回调传递给原始函数,并使用最终结果调用它。
  • 使用像async这样的流控制库来做到这一点并保持你的理智。
  • @jfriend00 原来的函数已经有回调了。 getData 已经有一个回调,它是循环到 for each 的函数。
  • 所以,添加第二个完成回调。您可以拥有多个。
  • 当然,这种深度嵌套的混乱应该使用异步库或 Promise 进行重新处理,两者都会为您提供更好的选择,让您了解何时完成所有操作并获得最终结果。如果您尝试对这种混乱进行强大的错误处理,则需要大量代码。这就是我对这类事情使用 Promise 的真正原因,因为它通过异步传播错误比其他任何事情都要好。

标签: javascript node.js asynchronous


【解决方案1】:

您可能会考虑使用模块来帮助组织和改进代码的布局/可读性,例如 async。它包含常见任务的解决方案,例如异步迭代集合或并行或串行执行函数列表。

【讨论】:

  • 您对使用异步库的哪些方法有什么建议吗?我研究了瀑布方法,但不确定它是否适用于循环。
猜你喜欢
  • 2019-03-15
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多