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

    });
}
Другие вопросы по тегам