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

Ani*_*aje 8 node.js

我正在将用 Node v6.10 编写的代码库迁移到 v10.15.3,
我希望使用 async/await 样式和 util 库来避免我的代码所具有的回调地狱,
我能够将函数转换为新的 async/ await 样式并使用 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();
Run Code Online (Sandbox Code Playgroud)

我遵循以下网站进行实施 -

1. util 实现 -
https://medium.com/@suyashmohan/util-promisify-in-node-js-v8-d07ef4ea8c53

2. 了解绑定函数 -
a) https://blog.cloudboost.io/nodejs-bind-function-e5d33ea081f0
b) JavaScript 'bind' 方法的使用

不确定是否有用例 -
1. https://github.com/nodejs/node/issues/13338
2.函数有效,但在使用 util.promisify() 时失败?

在此处输入图片说明

ben*_*ree 7

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

const run = util.promisify(thing.run).bind(thing);
Run Code Online (Sandbox Code Playgroud)

来源


Dan*_*515 5

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

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

这意味着如果该函数丢失其原始上下文(fs 模块)或已绑定,该函数将起作用,这并不重要。这就是为什么您发布的所有示例都可以正常工作的原因。

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

我的建议是单独调查每种情况或使用原生使用 Promise 的库。