如何在NodeJ中使用util.promisify和.bind函数?

时间:2019-05-15 06:44:09

标签: node.js

我正在将用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?

enter image description here

2 个答案:

答案 0 :(得分:2)

util.promisify没有绑定参数。因此,如果您需要绑定上下文,请执行以下操作:

const run = util.promisify(thing.run).bind(thing);

Source

答案 1 :(得分:0)

否,在这种情况下不需要。 如果您看一下readFile的实现,它在任何时候都不会使用this

https://github.com/nodejs/node/blob/master/lib/fs.js#L283

这意味着该函数将在丢失原始上下文(fs模块)或被绑定时起作用,这无关紧要。这就是为什么您发布的所有示例都可以正常工作的原因。

但是,有许多库取决于其this上下文,因此需要绑定。 如果有人建议您绑定所有内容,则他/她可能对javascript的工作原理不了解,他们只是喜欢绑定所有内容,因为如果不需要它,不会造成太大的伤害(只是对性能的影响很小而不在任何情况下都很明显)。

我的建议是分别调查每个案例或使用本机使用promise的库。