appendFile() запускается перед readFile(), хотя appendFile() находится в хронологическом порядке после readFile()
Я пытаюсь написать код, который читает файл, считает строки в нем, а затем добавляет еще одну строку с номером строки в начале. По сути, как index. Проблема в том, что fs.appendFile() запускается до завершения fs.readFile(), но я не уверен, почему. Что-то я делаю не так?
Мой код:
fs.readFile('list.txt', 'utf-8', (err, data) => {
if (err) throw err;
lines = data.split(/\r\n|\r|\n/).length - 1;
console.log("Im supposed to run first");
});
console.log("Im supposed to run second");
fs.appendFile('list.txt', '[' + lines + ']' + item + '\n', function(err) {
if (err) throw err;
console.log('List updated!');
fs.readFile('list.txt', 'utf-8', (err, data) => {
if (err) throw err;
// Converting Raw Buffer dto text
// data using tostring function.
message.channel.send('List was updated successfully! New list: \n' + data.toString());
console.log(data);
});
});
Мой вывод:
Im supposed to run second
List updated!
Im supposed to run first
[0]first item
2 ответа
В настоящее время вы используете readFile
а также appendFile
. Обе эти функции асинхронны и будут выполняться одновременно, возвращаясь при каждом завершении.
Если вы хотите запускать их синхронно, вы можете использовать методы fs.readFileSync и fs.appendFileSync для синхронного чтения и добавления файлов.
Следовательно, примерно так:
const readFileData = fs.readFileSync("list.txt");
fs.appendFileSync('list.txt', '[' + lines + ']' + item + '\n');
Будет запущена первая строка кода, затем вторая строка кода.
Используемые вами функции являются асинхронными, поэтому ответ второй функции может быть получен до ответа первой.
fs.readFile('list.txt', 'utf-8', (err, data) => {
if (err) throw err;
lines = data.split(/\r\n|\r|\n/).length - 1;
console.log("Im supposed to run first");
appendFile(lines);
});
let appendFile = (lines)=> {
fs.appendFile('list.txt', '[' + lines + ']' + item + '\n', function(err) {
console.log("Im supposed to run second");
if (err) throw err;
console.log('List updated!');
fs.readFile('list.txt', 'utf-8', (err, data) => {
if (err) throw err;
// Converting Raw Buffer dto text
// data using tostring function.
message.channel.send('List was updated successfully! New list: \n' + data.toString());
console.log(data);
});
});
}