Я проясняю мои сомнения относительно того, как Node.js выполняет таймеры. Обычно, когда в сценарии узла есть блок setTimeout, событие l oop, даже если у него нет ничего, будет ожидать указанные миллисекунды в setTimeout и завершится после выполнения обратного вызова.
Но рассмотрим ниже code
const fs = require('fs');
let readable = fs.createReadStream('large.csv');
readable.on('data', async chunk => {
let rows = parseCsvRow(chunk);
try {
for (let i = 0; i < rows.length; i++) {
console.log(i);
await someAsyncOperation(rows[i]);
}
} catch (error) {
//something went wrong
}
});
readable.on('end', chunk => {
console.log('csv file processed successfully');
});
function someAsyncOperation(){
return new Promise((resolve, reject) => {
setTimeout(resolve, 2000);
});
}
Файл CSV, который я читаю, содержит около 300 строк, и я запускаю запрос ajax для каждого (код скрыт для простоты), выполнение которого занимает около 100 мс, и я смоделировал его здесь, используя a setTimeout.
Когда я запускаю вышеуказанную программу, она почти мгновенно завершает работу, не дожидаясь успешного завершения всех ожидающих таймеров setTimeout. Только потому, что таймеры были запланированы изнутри события data
в потоке чтения, событие l oop игнорирует его? Не следует ли ждать, пока все таймеры будут запущены?
Примечание. Я понимаю, что приведенный выше код не является правильным способом выполнения того, что я делаю, но это всего лишь пример, демонстрирующий концепцию, с которой я сталкиваюсь время понимания.