关于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中的函数将在所有目录被读取后执行(可能需要一段时间)。

另外两个语句被执行同步,这意味着它们将直接运行。 因此,它们被打印在文件列表之前。