Жду обещанного fs.writeFile против fs.writeFileSync - PullRequest
0 голосов
/ 16 ноября 2018

Есть ли преимущества одного из этих параметров?

1.

const fs = require('fs')

const testFunc1 = async () => {
  fs.writeFileSync('text.txt', 'hello world')
}

2.

const fs = require('fs')
const util = require('util')
const writeFilePromisified = util.promisify(fs.writeFile)

const testFunc2 = async () => {
  await writeFilePromisified('text.txt', 'hello world')
}

Я знаю разницу между writeFile и writeFileSync.,Вопрос в том, существуют ли различия между обещаниями, которые возвращают testFunc1 и testFunc2.То же самое относится и к вызову testFunc1.then (...) //, или к ожидаемому testFunc1, или к testFunc2.then (...) //, или к ожидаемому testFunc2

Эти оба обещания будут выполнены, когда запись файласделанный.

Ответы [ 3 ]

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

fs.readFile принимает функцию обратного вызова , что означает, что она не будет блокировать выполнение вашего скрипта. fs.readFileSync однако не не принимает обратный вызов, что означает, что выполнение вашего сценария будет приостановлено до завершения процесса. Использование promisfy - один из способов решения этой проблемы, для небольших файлов это не будет иметь значения, но для больших файлов вы можете захотеть преобразовать fs.readFileSync в обещание, чтобы не блокировать выполнение. Надеюсь, это поможет.

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

Чтобы проиллюстрировать разницу между двумя обещаниями, которые возвращают функции:

const fs = require('fs')
const util = require('util')

const testFunc1 = async () => {
  fs.writeFileSync('text.txt', 'hello world')
  console.log('file write done with writeFileSync')
}

const writeFilePromisified = util.promisify(fs.writeFile)

const testFunc2 = async () => {
  await writeFilePromisified('text.txt', 'hello world')
  console.log('file write done with promisified writeFile')
}

console.log('start test1')
testFunc1().then(() => {
  console.log('promise 1 is fullfiled')
})
console.log('start test2')
testFunc2().then(() => {
  console.log('promise 2 is fullfiled')
})
console.log('stop')

Вывод будет:

start test1
file write done with writeFileSync
start test2
stop
promise 1 is fullfiled
file write done with promisified writeFile
promise 2 is fullfiled

Как и в случае с estus, testFunc1 блокирует выполнение основного потока. testFunc2 не блокировать.

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

fs уже содержит обещанный API , который не нуждается promisify.

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

Асинхронный readFile / writeFile не является блокирующим, а синхронный readFileSync / writeFileSync является блокирующим, но позволяет быстрее выполнить задание. Это может быть заметно во время интенсивных операций ввода-вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...