节点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