节点callback承诺与asynchronous/等待

我试图编写一个简单的函数,将节点式callback函数转换为承诺,所以我可以使用它们与asynchronous/等待。

当前代码:

function toPromise(ctx, func, ...args) { let newPromise; args.push((err, res) => { newPromise = new Promise((resolve, reject)=> { if(err) reject(err); else{ resolve(res) }; }); }); func.apply(ctx, args); return newPromise; } 

示例用法:

 const match = await toPromise(user, user.comparePassword, password); //trying to avoid the following: user.comparePassword(password, (err, res) => { ... }); 

这可能与一些伟大的图书馆没有任何意义,但我只是试图编码这是一个练习。

问题当然是匹配评估未定义,显然promise会在await语法行之后得到解决。

任何想法如何解决这个问题?

你的问题是你正在构buildasynchronouscallback内的newPromise 。 所以你还没有undefined当你返回它。 相反,您将需要立即调用Promise构造函数,并且只将resolve / reject置于asynchronouscallback中:

 function toPromise(ctx, func, ...args) { return new Promise((resolve, reject) => { args.push((err, res) => { if (err) reject(err); else resolve(res); }); func.apply(ctx, args); }); } 

另请参见如何将现有的callbackAPI转换为承诺?

从节点util.promisify他们添加了util.promisify

 const util = require('util'); const fs = require('fs'); const stat = util.promisify(fs.stat); stat('.').then((stats) => { // Do something with `stats` }).catch((error) => { // Handle the error. }); 

参考: https : //nodejs.org/api/util.html#util_util_promisify_original