2015-11-02 87 views
1

我想写一个简单的函数,将节点式回调函数转换为承诺,所以我可以使用它们与异步/等待。节点回调承诺与异步/等待

当前代码:

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) => { 
    ... }); 

这可能不与一些大图书馆在那里任何意义,但我只是想作为一个实现代码行使。

问题当然匹配评估为undefined,显然promise会在await语法行后解析。

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

回答

2

你的问题是你在构造newPromise里面的异步回调。所以you've still got undefined当你返回它。相反,你需要立即拨打Promise构造,只有把resolve/reject在异步回调:

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); 
    }); 
} 

How do I convert an existing callback API to promises?

+0

谢谢!该死的,我应该知道这个...... – Seneca

4

见由于他们增加了util.promisify节点V8.0.0。

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