Понимание fs.writeFileSync (путь, данные [, параметры]) Node.js - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть функция, которая записывает данные в файл, а затем загружает этот файл в облачное хранилище. Файл не завершает запись до того, как начнет загружаться, поэтому я получаю частичный файл в облачном хранилище. Я обнаружил, что fs.writeFileSync(path, data[, options]) может помочь, но я не совсем уверен, как это работает.

Насколько я понимаю, узел работает асинхронно, и у меня есть несколько асинхронных процессов, запущенных до этой части кода. Я понимаю, что означает синхронный против асинхронного, но у меня возникли небольшие проблемы с пониманием того, как это работает в этом примере. Вот мои вопросы, если я заменю приведенный ниже код на fs.writeFileSync(path, data[, options])

  1. Что означают документы под "Синхронное добавление данных в файл"
    • а. Будут ли остановлены следующие строки кода до тех пор, пока не закончится fs.writeFileSync(path, data)?
    • б. Остановлены ли предыдущие асинхронные процессы этой строкой кода?
  2. Если другие асинхронные процессы не затрагиваются, чем writeFileSync отличается от writeFile?

  3. Есть ли в * 1026 функция обратного вызова, которую я неправильно понимаю?

Код для справки

outCsv = "x","y","z"
filename = "file.csv"
fs.writeFile(filename, outCsv, function (err) {
        if (err) {
            return console.log(err);
        }
        console.log('The file was saved!');
        bucket.upload(filename, (err, file) => {
            if (err) {
                return console.log(err);
            }
            console.log('The file was uploaded!');
        });
    });

1 Ответ

0 голосов
/ 15 ноября 2018

Будут ли остановлены следующие строки кода до завершения fs.writeFileSync (путь, данные)?

Да.Это операция блокировки.Обратите внимание, что вы предполагаете, что fs.writeFileSync заканчивается .

Остановлены ли предыдущие асинхронные процессы этой строкой кода?

Вроде.Поскольку JavaScript является однопоточным, он также не будет работать во время записи файла, но будет поставлен в очередь на следующем такте цикла событий.

Если другие асинхронные процессы не затронуты, как writeFileSyncотличается от writeFile?

Он блокирует любой код, который идет после него.Для более простого примера рассмотрим следующее:

setTimeout(() => console.log('3'), 5);
console.log('1'); // fs.writeFileSync
console.log('2');

против

setTimeout(() => console.log('3'), 5);
setTimeout(() => console.log('1'), 0); // fs.writeFile
console.log('2');

Первый выводит 1 2 3, потому что вызов console.log блокирует последующее.Второй выводит 2 1 3, потому что setTimeout не блокирует.Код, который печатает 3, никоим образом не затронут: 3 всегда будет последним.

Есть ли в writeFileSync функция обратного вызова, которую я неправильно понимаю?

Не 'я знаюВы не опубликовали достаточно кода, чтобы мы могли сказать.

Все это заставляет задуматься о том, почему предпочтительнее fs.writeFile, чем альтернативе.Ответ таков:

Версия синхронизации блокирует .

Хотя это занимает много времени, например, ваш веб-сервер не обрабатывает запросы.

...