【发布时间】: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