正确使用util.promisify节点js

时间:2018-11-27 14:56:14

标签: node.js promise

我正在尝试使用util.promisifyAWS Document client get函数转换为基于Promise的实用程序。但这似乎不符合预期;

// This does not work as expected
const docClient = new AWS.DynamoDB.DocumentClient();
let docClientGet = require('util').promisify(docClient.get);

但是,当我平时做这样的承诺转换时,

  let docClientGet = function (params) {
    return new Promise((resolve, reject) => {
      docClient.get(params, function (err, data) {
        if (err) {
          return reject(err);
        }

        return resolve(data);
      })
    })
  };

并在这样的异步函数中使用它:

await docClientGet(params);

有效!。

我想知道我在理解util.promisify方面哪里错了

1 个答案:

答案 0 :(得分:1)

如果您要传播的方法需要与其所在的对象相关联(看起来就像您的情况一样,那么此代码:

let docClientGet = utils.promisify(docClient.get);

将不保留与docClient对象的关联。发生的情况是,在没有将docClient.get()值设置为this对象的情况下调用了承诺的docClient,它无法正常工作。

您可以通过以下方法解决此问题:

utils.promisify(docClient.get.bind(docClient));

promisify doc不清楚,因为它使用了fs库中的示例,该示例的方法不需要与fs对象相关联即可正常工作。< / p>

P.S。将util库放入名为utils的变量中是有点不寻常的。这可能会使一些人混淆您的代码。