关于nodejscallback执行顺序问题的一个例子,我不明白
我写了一个示例代码如下。
//test.js var fs = require('fs'); fs.readdir(__dirname+'/app/img/', function(err, files) { console.log(files); }); someFunction(function(output){ console.log(output); }); console.log('This is the final console call'); function someFunction(callback) { callback(' I am some funciton. '); }
然后,运行'node test.js'后,得到如下结果。
$ node test2.js I am some funciton. This is the final console call [ 'photo1', 'photo2' ]
someFunction()是我自己创build的,用于模拟fs.readdir()中的callback函数。 而作为我原来的假设,结果应该是
[ 'photo1', 'photo2' ] I am some funciton. This is the final console call
要么
This is the final console call [ 'photo1', 'photo2' ] I am some funciton.
但现在,fs.readdir()和someFunction()的日志分别出现在最终通话logging日志的前后。
嗯….我完全无法弄清楚它。
所以我的问题是:
为什么来自fs.readdir()的日志是最后一个日志?
这是否是因为fs.readdir()需要更多时间来执行?
或者说,我对这个问题缺乏一些重要的概念?
谢谢〜!
asynchronousNodeJS接口的重点在于,您可以继续运行程序而无需等待readdir等长时间延迟的函数返回结果。 你调用eraddir来告诉它开始处理,继续运行你的程序,当readdir完成时,它会安排调用你通过的callback函数。 如果您同时调用多个asynchronous函数,则无法保证哪个会先完成。
如果你想让所有这些console.logs函数顺序执行,你需要嵌套callback函数
var fs = require('fs'); function someFunction(callback) { callback(' I am some funciton. '); } fs.readdir(__dirname+'/app/img/', function(err, files) { console.log(files); someFunction(function(output){ console.log(output); console.log('This is the final console call'); }); });
延时略好的方法是一次完成所有的调用,然后等到一切都完成后再打印结果。
// receives an array of computations to run in parallel // calls a callback with an array with the results when all computations are done // each computation is a function that takes a return callback as its first parameter. function parallel(computations, callback){ var results = []; var n = 0; computations.forEach(function(comp, i){ comp(function(result){ n++; results[i] = result; if(n === computations.length){ callback(results); } }); }); } var fs = require('fs'); function someFunction(callback) { callback(' I am some funciton. '); } parallel([ function(cb){ fs.readdir(__dirname+'/app/img/', function(err, files) { cb(files); }); }, function(cb){ someFunction(function(output){ cb(output); }); }, ], function(results){ console.log(results[0]); console.log(results[1]); console.log("This is the final console call"); });
我不会推荐手动编码这种并行同步。 有许多asynchronous编程库,使这个过程更愉快,提供这个和更多。
fs.readdir函数是asynchronous执行的,而另外两个则不是。 这意味着fs.readdir中的函数将在所有目录被读取后执行(可能需要一段时间)。
另外两个语句被执行同步,这意味着它们将直接运行。 因此,它们被打印在文件列表之前。