我正在尝试使用util.promisify将AWS 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
方面哪里错了
答案 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
的变量中是有点不寻常的。这可能会使一些人混淆您的代码。