Node.js 等待指定的fs.writeFile vs fs.writeFileSync

Node.js 等待指定的fs.writeFile vs fs.writeFileSync,node.js,promise,Node.js,Promise,其中一个选项有什么优点吗 一, 二, 我知道writeFile和writeFileSync之间的区别。问题是返回testFunc1和testFunc2的期票之间是否存在一些差异。打电话也一样吗 testFunc1.then(…)//或等待testFunc1 或 testFunc2.then(…)//或等待testFunc2 当文件写入完成时,这两个承诺都将被填满 fs已包含不需要promisify的内容 基于承诺的异步版本要求将其作为基于承诺的控制流的一部分使用,而同步版本不强制执行此要求 异步

其中一个选项有什么优点吗

一,

二,

我知道writeFile和writeFileSync之间的区别。问题是返回testFunc1和testFunc2的期票之间是否存在一些差异。打电话也一样吗 testFunc1.then(…)//或等待testFunc1 或 testFunc2.then(…)//或等待testFunc2


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

fs
已包含不需要
promisify
的内容

基于承诺的异步版本要求将其作为基于承诺的控制流的一部分使用,而同步版本不强制执行此要求


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

fs.readFile
使用回调函数,这意味着它不会阻止脚本的执行。
fs.readFileSync
但是不接受回调,这意味着脚本的执行将暂停,直到进程完成。 使用promisfy是解决此问题的一种方法,对于小文件,它不会产生任何影响,但是对于大文件,您可能希望将
fs.readFileSync
转换为承诺,以便不会阻止执行。
希望这会有所帮助。

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

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不阻塞。

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

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

但随后我测量了writeFile()在不等待其回调参数被调用时所用的时间。速度上有很大的差别,可能是10倍

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


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

fs.promise API对于节点10是实验性的。请解释返回testFunc1和testFunc2的两个Promiss之间的区别。正如我所看到的,这里没有差异。
testFunc1()
是无用的。做一个承诺并没有什么好处。它会阻止主线程,因为
writeFileSync
是同步的。然后,如果产生的承诺是
wait
ed,则提供一个微小的延迟。
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