#javascript #node.js #ecmascript-6
#javascript #node.js #ecmascript-6
Вопрос:
У меня возникли проблемы с чтением данных из файла, созданного с помощью fs.createWriteStream.
Похоже, что stream.write выполняется в конце программы после чтения файла, а не при их вызове (что объясняет, почему во время его вывода в variable_3 ничего нет).
Используемая функция выглядит следующим образом (упрощенно):
module.exports = async data1 => {
console.log('start');
try {
const stream = fs.createWriteStream(filename_1, { flags: "a" });
console.log('stream created');
stream.write("some data", (err) => {
if (err) {
console.log(err.message);
} else {
console.log("data written");
}
});
for (const variable_1 of object_1) {
const variable_2 = await function2({
// generates a buffer
});
stream.write(variable_2, (err) => {
if (err) {
console.log(err.message);
} else {
console.log("data written");
}
});
}
stream.end();
console.log('stream ended');
console.log('opening file');
const variable_3 = fs.readFileSync(filename_1);
console.log('file opened and read with data: ' variable_3);
return;
} catch (error) {
console.log(error);
}
};
Output:
> start
> stream created
> stream ended
> opening file
> file opened and read with data:
> data written
> data written
Однако после запуска кода, когда я открываю filename_1 (через проводник), все данные присутствуют ?!
Комментарии:
1.
await stream.end();
не имеет особого смысла.end
функция не возвращает обещание. Вместо этого выполняется обратный вызов. То же самое дляawait stream.write(variable_2)
.write
возвращает флаг, если вам следует дождаться события drain или продолжить запись.2. Спасибо, что указали на это. Я отредактировал OP. Есть ли у вас какие-либо предложения относительно недоступности данных при запросе в
console.log(variable_3)
?3. После дополнительных исследований я обнаружил, что данные, похоже, записываются в конце программы, а не при вызове. Я обновил сообщение, чтобы отразить изменения.
Ответ №1:
В конце концов все разобрал.
Не понял, что потоковые функции не возвращают обещание, поэтому мне пришлось вручную вернуть обещание.
Вот измененный код:
module.exports = async data1 => {
console.log('start');
try {
const stream = fs.createWriteStream(filename_1, { flags: "a" });
console.log('stream created');
stream.write("some data", (err) => {
if (err) {
console.log(err.message);
} else {
console.log("data written");
}
});
for (const variable_1 of object_1) {
const variable_2 = await function2({
// generates a buffer
});
stream.write(variable_2, (err) => {
if (err) {
console.log(err.message);
} else {
console.log("data written");
}
});
}
stream.end();
console.log('stream ended');
console.log('opening file');
const variable_3 = fs.readFileSync(filename_1);
console.log('file opened and read with data: ' variable_3);
return new Promise(resolve => {
stream.on('finish', () => {
resolve('done');
console.log("createNRRD is done");
});
});
} catch (error) {
console.log(error);
}
};