嵌套异步调用有什么好处(使用async,setImmediate,Promises等)

时间:2017-05-23 12:08:22

标签: node.js asynchronous async.js event-loop

在NodeJs中有很多技术/库可以帮助我们创建异步工作,例如:节点异步库,Promises,使用NodeJs标准调用(setImmediate / setTimeout / nextTick)。

关于服务器端应用程序,有时我遇到这样的代码:

function doWork() {
    async.parallel([work1func, work2func],
    (err, result) => { doSomthingWithTheResult(); }
}

function work1func(cb) {
    doSomeStuff1();
    async.series([moreWork1, moreWork2…], cb);
}

function work2func(cb) {
    doSomeStuff2();
    async.series([moreWork3, moreWork4…], cb);
}

正如您所看到的,在work1Func,work2Func中,还有使用async.series的其他函数的异步内部调用(可能是async.parallel或任何其他异步机制)。

问:嵌套异步调用有什么好处吗?我在问,因为如果我们已经异步运行,如果最顶层的调用是异步的,为什么还要进行嵌套调用async。

有人可以解释(也许举个例子),并在这里给出一些规则吗?什么时候我应该在异步调用中嵌套异步调用,只需要一个异步即可。

1 个答案:

答案 0 :(得分:0)

这不是利益问题。如果您有一个已知异步完成的外部任务,但它调用异步完成的内部任务,则外部和内部任务都必须相互独立地处理它们的异步性。如果内部任务的异步性被忽略,那么外部任务可能会在内部实际完成之前错误地完成。

例如:假设您有一个模块可以对多个外部服务(API,数据库等)进行查询,并执行一些操作来组合结果。显然,模块异步完成其任务,因为它依赖于其他服务;但是每个服务调用都是异步完成的。由于模块对这些内部调用的结果进行操作,因此如果它们也不是异步的,则无法返回正确的输出。

即使只有一个内部任务,该模块仍然需要等待才能处理结果。忽略异步性只有在你不关心任何阶段的输出时才是可行的。