Как подождать, пока поток файлов не будет написан, прежде чем я его закрою?

81
7

Я создаю поток файлов для записи файла csv:

    var logger = fs.createWriteStream('restaurants.csv', {
flags: 'w' // 'a' means appending (old data will be preserved)
});
logger.write("sep=,\n");

Когда я закончил писать, я закрываю поток следующим образом:

    logger.end();
logger.close();

Но когда я это делаю, часть файла отсутствует в конце. Я попытался спать, прежде чем закрыть поток:

    await Promise.delay(2000);
logger.end();
logger.close();

И вдруг файл завершен. Но тайм-аут - это своеобразное глупое решение. Выводит ли filestream любое событие, когда оно записывается. В основном мне нужно:

    await logger.doneWriting();
logger.end();
logger.close();

Конечно, я могу обещать любое событие, но какое это событие?

спросил(а) 2017-06-02T16:12:00+03:00 3 года, 4 месяца назад
1
Решение
70

fs.createWriteStream() возвращает объект WriteStream, который является WritableStream, это означает, что при вызове .write() вы вызываете .write() (), который фактически принимает обратный вызов в качестве параметра, поэтому вы можете закрыть поток сразу после него отделки!

var logger = fs.createWriteStream('restaurants.csv', {
flags: 'w' // 'a' means appending (old data will be preserved)
});
logger.write("sep=,\n", () => {
// Done writing... do what needed then close the stream if it isn't used anymore
});

Асинхронный JavaScript практически стал стандартом в настоящее время, всегда будьте в поиске функции обратного вызова, это то, что позволяет запускать код после завершения построения асинхронного блока при его завершении.

ответил(а) 2017-06-02T16:25:00+03:00 3 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема