节点回调承诺使用async / await

时间:2015-11-02 11:47:04

标签: javascript node.js async-await es6-promise

我试图编写一个将节点式回调函数转换为promises的简单函数,因此我可以将它们与async / await一起使用。

当前代码:

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

对于一些优秀的图书馆来说,这可能没有任何意义,但我只是试图将其编码为练习。

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

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:8)

自节点v8.0.0起,他们添加了SELECT * from eqDoesntExcist WHERE name = "Troy"

util.promisify

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

答案 1 :(得分:3)

您的问题是您正在构建异步回调内部的Collections.sort(ms, new Comparator<Municipio>() { @Override public int compare(final Municipio o1, final Municipio o2) { // TODO compare o1 and o2: // return 1; //if o1 > o2 // return -1; //if o1 < o2 // return 0; //if o1 == o2 } }); 。当你归还时you've still got undefined。相反,您需要立即调用newPromise构造函数,并仅将Promise / resolve放入异步回调中:

reject

另见How do I convert an existing callback API to promises?