2016-12-06 19 views
-1

Почему, если вы:Почему fs.readFile возвращается в разных заказах?

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

вы получите разные результаты каждый раз?

Я предполагаю, что это как-то связано с циклом событий async узла, но не совсем уверен, как это работает.

+0

fs.readFile is async. Вы ответили на свой вопрос. Файлы могут считываться с различной скоростью. –

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

Я бы предложил не использовать это, но если у вас есть, чтобы потом это один из пути. Вы должны проверить async.js http://caolan.github.io/async/docs.html#map как предложено @ jordan-s.

+0

Да, на самом деле не ищу другого способа, я просто хочу знать, почему порядок асинхронных процессов возвращается неупорядоченно, если они всегда вызываются в том же порядке. – Deviljho