我正在将用Node v6.10编写的代码库迁移到v10.15.3,
我希望使用async / await样式和util库来避免代码中的回调地狱,
我能够将功能转换为新的异步/等待样式并使用util库功能。
有人强烈建议我将.bind函数链接到util.promisify()函数,
我知道.bind()用于变量/对象范围。
但是,确实有必要在使用util lib进行承诺化之后执行.bind吗?
以下是我的示例代码-
let fs = require('fs');
let util = require('util');
let test = async () => {
let keyPath = 'someFile.txt';
//This works
const fsReadFile = util.promisify(fs.readFile);
//This also works
//const fsReadFile = util.promisify(fs.readFile).bind(this);
//This also works
//const fsReadFile = util.promisify(fs.readFile).bind(fs);
var fileContent = await fsReadFile(keyPath, 'utf8');
console.log(fileContent);
};
test();
我关注了以下网站进行实施-
1。 util实现-
https://medium.com/@suyashmohan/util-promisify-in-node-js-v8-d07ef4ea8c53
2。了解绑定功能-
a)https://blog.cloudboost.io/nodejs-bind-function-e5d33ea081f0
b)Use of the JavaScript 'bind' method
不确定是否存在用例-
1. https://github.com/nodejs/node/issues/13338
2. Function works, but fails when util.promisify() used?
答案 0 :(得分:2)
util.promisify
没有绑定参数。因此,如果您需要绑定上下文,请执行以下操作:
const run = util.promisify(thing.run).bind(thing);
答案 1 :(得分:0)
否,在这种情况下不需要。
如果您看一下readFile的实现,它在任何时候都不会使用this
:
https://github.com/nodejs/node/blob/master/lib/fs.js#L283
这意味着该函数将在丢失原始上下文(fs模块)或被绑定时起作用,这无关紧要。这就是为什么您发布的所有示例都可以正常工作的原因。
但是,有许多库取决于其this
上下文,因此需要绑定。
如果有人建议您绑定所有内容,则他/她可能对javascript的工作原理不了解,他们只是喜欢绑定所有内容,因为如果不需要它,不会造成太大的伤害(只是对性能的影响很小而不在任何情况下都很明显)。
我的建议是分别调查每个案例或使用本机使用promise的库。