可以使用回调让几个异步任务按顺序执行,但如果任务很多、必须组织一下,否则过多的回调嵌套会把代码搞得很乱。
下面这段代码就是用回调让任务顺序执行的。
这个例子用setTimeout模拟需要花时间执行的任务:第一个任务用一秒,第二个用半秒,最后一个用十分之一秒。
setTimeout只是一个人工模拟,在真正的代码中可能是读取文件、发起HTTP请求等。这段代码虽然不长,但它算是比较乱的了,并且也没有程序化添加另一个任务的简单办法。
setTimeout(() => {
console.log('我第一个执行');
setTimeout(() => {
console.log('我接着执行');
setTimeout(() => {
console.log('我最后执行');
},100);
},500);
},1000);

此外,你也可以用Async这样的流程控制工具执行这些任务。
Async用起来简单直接,并且它的代码量很小(经过缩小化和压缩后只有837个字节)。下面这个命令是用来安装 Async的:
npm install async

下面的代码用串行化流程控制工具重新编写了前面那段代码。
【用社区贡献的工具实现串行化控制】
const async = require('async');
async.series([
callback => {
setTimeout(() => {
console.log('我第一个执行');
callback();
}, 1000);
},
callback => {
setTimeout(() => {
console.log('我接着执行');
callback();
}, 500);
},
callback => {
setTimeout(() => {
console.log('我最后执行');
callback();
},100);
}
]);

尽管这种用流程控制实现的版本代码更多,但通常可读性和可维护性更强。你一般也不会一直用流程控制,但当碰到想要躲开回调嵌套的情况时,它就会是改善代码可读性的好工具。