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

时间:2018-11-16 12:11:13

标签: node.js promise

其中一个选项是否有某些优势?

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

完成文件写入后,这两个承诺都将被满足。

4 个答案:

答案 0 :(得分:1)

fs已经包含promisified API,不需要promisify

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

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

答案 1 :(得分:1)

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

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不会阻止。

答案 2 :(得分:0)

fs.readFile具有 回调函数 ,这意味着它不会阻止脚本的执行。 fs.readFileSync但是进行回调,这意味着脚本的执行将被暂停,直到该过程完成为止。 使用promisfy是解决此问题的一种方法,对于小型文件而言,它不会有所作为,但是对于大型文件,您可能希望将fs.readFileSync转换为Promise,从而不会阻塞执行。 希望有帮助。

答案 3 :(得分:0)

writeFile() 和 writeFileSync() 之间的区别正如其他人所解释的那样 writeFileSync() “阻塞”。那么,“阻塞”和“不阻塞”有什么区别?

我写了一个小测试,比较了 writeFile() 和 writeFileSync() 的速度。我测量了 writeFileSync() 返回结果所花费的时间与从调用 writeFile() 到其回调参数被调用所花费的时间。令我(最初)惊讶的是,两者之间没有明显的区别。 writeFile() 似乎并不比 writeFileSync() 快。那么当它似乎使我的程序流复杂化时,我为什么要使用它?

但是如果我没有等待它的回调参数被调用,我测量了 writeFile() 花费的时间。速度差异很大,可能是 10 倍。

因此有很大差异或没有差异取决于程序的其余部分。如果您调用 writeFileSync() 需要很长时间,则您的程序在等待 writeFileSync() 返回时无法执行任何其他操作。如果您执行 writeFile() 并在执行其他任何操作之前等待回调完成,则结果没有什么不同。但是如果您不(需要)等待其回调被调用,则 writeFile() 会快得多。

如果您编写某种调用 writeFileSync() 的服务器,这将有很大的不同。服务器在等待 writeFileSync() 完成时无法为任何新请求提供服务。如果大多数请求导致对 writeFileSync() 的调用可能会对您的服务器性能产生重大影响。