每个模块文件中都需要 Promise.promisifyAll() 吗?
Do i need Promise.promisifyAll() in every module file?
如果我需要在多个文件中使用 Promise (Bluebird),我应该每次都调用 Promise.promisifyAll(require('fs')) 吗?
或者使用
的小模块会更好吗?
module.exports = Promise.promisifyAll(require('fs'))
并且只导入那个模块?
如果我做对了,我的第一个选择每次都会承诺 fs 模块,第二个只会 link 到同一个模块,只有一次承诺。还是我的第一选择会像我的第二选择一样?
编辑:
我测试了两个选项:
const Promise = require('bluebird')
let time1start = Date.now()
for(let i = 0; i <= 1000;i++){
let fs = Promise.promisifyAll(require('fs'))
}
console.log('Time gone 1 Test: ' + (Date.now() - time1start))
let time2start = Date.now()
for(let i = 0; i <= 1000;i++){
let fs = require('./testInc')
}
console.log('Time gone 2 Test: ' + (Date.now() - time2start))
testinc.js:
module.exports = require('bluebird').promisifyAll(require('fs'))
结果是:
时间过去了 1 测试:891
时光荏苒 2 测试:10
所以我的理论是对的,第二种更快
在您的第一个解决方案中,每次需要时都会生成 fs 的 promisify 版本。但是在你的第二个解决方案中,promisify 只会发生一次,当模块被加载到内存中时,那么每次你使用它时,你只会指向同一个对象。
// file fs-promise.js
module.exports = Promise.promisifyAll(require('fs'));
// other file
const fsp = require('./fs-promise.js');
两种解决方案都可以,我认为您应该评估使用其中一种的性能。
如果我需要在多个文件中使用 Promise (Bluebird),我应该每次都调用 Promise.promisifyAll(require('fs')) 吗? 或者使用
的小模块会更好吗?module.exports = Promise.promisifyAll(require('fs'))
并且只导入那个模块?
如果我做对了,我的第一个选择每次都会承诺 fs 模块,第二个只会 link 到同一个模块,只有一次承诺。还是我的第一选择会像我的第二选择一样?
编辑: 我测试了两个选项:
const Promise = require('bluebird')
let time1start = Date.now()
for(let i = 0; i <= 1000;i++){
let fs = Promise.promisifyAll(require('fs'))
}
console.log('Time gone 1 Test: ' + (Date.now() - time1start))
let time2start = Date.now()
for(let i = 0; i <= 1000;i++){
let fs = require('./testInc')
}
console.log('Time gone 2 Test: ' + (Date.now() - time2start))
testinc.js:
module.exports = require('bluebird').promisifyAll(require('fs'))
结果是: 时间过去了 1 测试:891 时光荏苒 2 测试:10
所以我的理论是对的,第二种更快
在您的第一个解决方案中,每次需要时都会生成 fs 的 promisify 版本。但是在你的第二个解决方案中,promisify 只会发生一次,当模块被加载到内存中时,那么每次你使用它时,你只会指向同一个对象。
// file fs-promise.js
module.exports = Promise.promisifyAll(require('fs'));
// other file
const fsp = require('./fs-promise.js');
两种解决方案都可以,我认为您应该评估使用其中一种的性能。