Javascript 为什么fs.readFile会以不同的顺序返回?

Javascript 为什么fs.readFile会以不同的顺序返回?,javascript,node.js,asynchronous,readfile,event-loop,Javascript,Node.js,Asynchronous,Readfile,Event Loop,为什么如果你这样做: for (var i = 0; i < 5; i++) { fs.readFile('file' + i, function(err, data) { console.log('file: ', data); }); } for(变量i=0;i

为什么如果你这样做:

for (var i = 0; i < 5; i++) {
    fs.readFile('file' + i, function(err, data) {
      console.log('file: ', data);
    });
}
for(变量i=0;i<5;i++){
fs.readFile('file'+i,函数(err,数据){
log('文件:',数据);
});
}
你每次都得到不同的结果


我猜这与节点的“异步”事件循环有关,但并不确定它是如何工作的。

这将启动并获取文件,在每次完成后将数据返回回调。你永远都不知道哪一个会先完成,哪一个会先下订单。如果您需要等待所有5个文件后再执行某些操作,请查看异步库:


异步
fs
方法利用libuv的线程池,操作系统可以对这些线程的执行进行不同的排序/调度(尤其取决于操作系统使用的调度程序类型)。

您可以执行以下操作:-

for (var i = 0; i < 5; i++) {
    // put the statement in try-catch in case some of the files do not exists or
    // you get some other error
    try {
        // to show actual contents of the file instead of a buffer
        console.log(fs.readFileSync('file' + i).toString());
    } catch (error) {
        console.error(error);
    }
}
for(变量i=0;i<5;i++){
//将语句放入try-catch中,以防某些文件不存在或丢失
//你还有其他错误
试一试{
//显示文件的实际内容而不是缓冲区
log(fs.readFileSync('file'+i.toString());
}捕获(错误){
控制台错误(error);
}
}

我建议不要使用这个,但如果你必须这样做的话,这是一种方式。您应该按照@jordan-s的建议签出async.js。

fs.readFile是异步的。你回答了你自己的问题。文件可能以不同的速度读取。我知道它是异步的,我想知道每次都有什么不同,它是随机的吗?为什么每次都不以相同的顺序返回它们?它不是发出外部请求,只是读取文件,为什么每次都以不同的顺序读取文件,是什么让它读取其中一个文件更快呢?。你可以阅读我选择的答案来理解我的问题;)是的,我知道如何处理它们,只是想知道为什么它们以不同的顺序返回,可能是在较低的级别。是的,实际上并不是在寻找不同的方法,我只是想知道为什么异步进程上的顺序返回无序,如果它们总是以相同的顺序调用。我想这是最接近我所寻找的,谢谢。
for (var i = 0; i < 5; i++) {
    // put the statement in try-catch in case some of the files do not exists or
    // you get some other error
    try {
        // to show actual contents of the file instead of a buffer
        console.log(fs.readFileSync('file' + i).toString());
    } catch (error) {
        console.error(error);
    }
}