2016-12-06 48 views
-1

为什么如果你这样做:为什么fs.readFile以不同的顺序返回?

for (var i = 0; i < 5; i++) { 
    fs.readFile('file' + i, function(err, data) { 
     console.log('file: ', data); 
    }); 
} 

你每次不同的结果?

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

+0

fs.readFile是异步的。你是在自问自答。文件可能以不同的速度读取。 –

+0

我知道它的异步,我想知道每次有什么区别,它是随机的吗,为什么不每次都以相同的顺序返回它们?它没有提出外部请求,只是读取文件,为什么它每次都以不同的顺序读取它们,是什么让它们在读取文件时更快? 你可以阅读我选择了解我在问什么的答案;) – Deviljho

回答

1

异步fs方法利用libuv的线程池和那些线程的执行可以订购/由操作系统调度的不同(特别是根据由操作系统使用调度器的类型)。

+0

我认为这是最接近我所寻找的,谢谢。 – Deviljho

0

这将关闭并获取文件,每次完成时将数据返回给您的回调。你永远不会知道哪些将首先完成或订单。如果您需要等待所有5个文件,然后再查看异步库:https://www.npmjs.com/package/async

fs.readFile('file' + i, function(err, data) { 
    console.log('file: ', data); 
}); 
+0

是的,我知道如何处理它们,只是想知道他们为什么会以不同的顺序返回,可能是在较低的水平。 – Deviljho

0

你可以这样做: -

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); 
    } 
} 

我会建议不要使用这一点,但如果你有,那么这是方式之一。您应该按照@ jordan-s的建议结账async.js http://caolan.github.io/async/docs.html#map

+0

是的,实际上并没有寻找不同的方法,我只是想知道为什么异步过程的顺序返回无序,如果它们总是以相同的顺序调用。 – Deviljho

相关问题