我发现nodejs的异步是这样的。
请看图:
请看代码:
for(let i = 0; i < 5; i++){
test(i);
}
function test(i){
waterfall([
//步骤1
function(callback) {
thread(function (){
dlog('线程A'+i);
callback(null, i);
}, 800);
},
//步骤2
function(a, callback){
thread(function (){
dlog('线程B'+i);
callback(null, i);
}, 800);
}
], function (err, result) {
dlog('任务结束'+result);
});
}
function dlog(msg){
console.log(msg);
}
function thread(callBack, time){
setTimeout(function(){
callBack();
}, time)
}
也就是说,先执行完外层的任务,再执行内层的任务。
也就是顺序是:
A0,A1,A2,……
B0,B1,B2,……
现在我希望的顺序是:
A0,B0,A1,B1……
有什么办法吗?
办法可能就是执行完一个任务再执行下一个任务,不过这样速度可就慢了,体现不出异步执行的优点了
test(0);
function test(i){
waterfall([
//步骤1
function(callback) {
thread(function (){
dlog('线程A'+i);
callback(null, i);
}, 800);
},
//步骤2
function(a, callback){
thread(function (){
dlog('线程B'+i);
callback(null, i);
}, 800);
}
], function (err, result) {
dlog('任务结束'+result);
if(i < 5) test(i+1);
});
}
为啥我会有这么个需求。简单来说,假如你用程序读取1万个文件,只是打个比分。
你需要每次读取完成一个文件,告诉用户执行到26%这样的进度条给他。让他知道程序是在干活的。
如果按照平时的异步运行顺序。nodejs是循环读取了一万次之后,才开始读取第一个文件成功。那么循环一万次的这个过程中,进度条就是0%。毫无变化。让用户觉得,程序啥事也没干。
-------------补充-----------------
很久之后,我才知道,这个可以用并发数来控制,比如一次读10条,读完再换下一批。
node 是单线程异步