等待承诺的 fs.writeFile 与 fs.writeFileSync

shu*_*rik 6 node.js promise

此选项之一是否有一些优点?

1.

const fs = require('fs')

const testFunc1 = async () => {
  fs.writeFileSync('text.txt', 'hello world')
}
Run Code Online (Sandbox Code Playgroud)

2.

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

const testFunc2 = async () => {
  await writeFilePromisified('text.txt', 'hello world')
}
Run Code Online (Sandbox Code Playgroud)

我知道 writeFile 和 writeFileSync 之间的区别。问题是返回 testFunc1 和 testFunc2 的承诺之间是否存在一些差异。所以它与调用 testFunc1.then(...) // 或 await testFunc1 或 testFunc2.then(...) // 或 await testFunc2 是一样的

当文件写入完成时,这两个承诺都将被完成。

Est*_*ask 8

fs已经包含promisified API不需要promisify

基于承诺的异步版本需要将其用作基于承诺的控制流的一部分,而同步版本不强加此要求。

异步readFile/writeFile是非阻塞的,而同步readFileSync/writeFileSync是阻塞的,但可以更快地完成工作。这在密集的 IO 操作期间可能会很明显。

  • fs.promise API 对于节点 10 是实验性的。 (3认同)

shu*_*rik 5

为了说明两个返回函数的 promise 之间的区别:

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')
Run Code Online (Sandbox Code Playgroud)

输出将是:

start test1
file write done with writeFileSync
start test2
stop
promise 1 is fullfiled
file write done with promisified writeFile
promise 2 is fullfiled
Run Code Online (Sandbox Code Playgroud)

所以就像estus所说的testFunc1阻塞了主线程的执行。testFunc2 不会阻塞。