如图 测试发现如果query.exec()中执行耗时的操作,基本上等于没有异步处理,一个请求需要10秒,两个请求就需要20秒。 这是为什么?
async.series就是顺序执行的啊,一个执行完成后才执行下一个,所以时间会累加起来:
Run the functions in the tasks array in series, each one running once the previous function has completed.
摘自github的说明:https://github.com/caolan/async#seriestasks-callback
@cheergoh 楼主你的代码提炼一下是不是这个意思:
var async = require( 'async' );
function api( callback ) {
async.series( {
one : function( cb ) {
setTimeout( function() {
cb( null, 'hello' );
} , 10000 );
}
}, function( err, result ) {
callback( result );
} );
}
// Call the API 3 times
var n = 0;
var start_ms = new Date().getTime()
for(var i=0; i<3; ++i ) {
api( function( result ) {
console.log( result );
if( ++n >= 3 ) {
console.log( 'ms: ', new Date().getTime() - start_ms );
process.exit( 0 );
}
} );
}
我这测试最终打印的时间是10031毫秒,结果和预期的10秒是一致的啊
@cheergoh 如果我没有理解错你的意思的话,那就是你理解错异步了。
query.exec(function(err, list){
sleep(10000);
cb(err,list);
})
上面的代码是在主线程里同步执行的,如果你在javascript代码里有耗时操作,那就是实实在在的耗时,javascript内的任何代码都是同步执行的,绝对不会异步执行。javascript代码只能发起异步命令,这个异步命令发布完成后,程序不是傻等, 而是去处理已完成的异步请求。所以按照这个解释,你最后一个回复当然会消耗100秒。发起异步命令和异步完成后的回调时间我们假设很短,忽略不计,你发出了10条异步请求,等待回复,最快的情况我们假设是立即返回,异步处理时间也忽略不计,你发出的异步请求随即的返回了,由于是并行的,完成的先后顺序不确定,顺序其实不是关键,接下来我们来处理数据,在主线程内,我们先处理第一个10秒,完成后发送数据,第二个开始处理就是从第一个完成开始的,以此类推,最后一个耗时就是100秒。
千万不要以为回调里面代码是异步执行的,回调是同步执行的,回调执行的时候,异步请求已经结束了。javascript代码永远是同步的,里面耗时的计算是实打实的。