其中一个选项是否有某些优势?
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
完成文件写入后,这两个承诺都将被满足。
答案 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() 的调用可能会对您的服务器性能产生重大影响。