簡體   English   中英

節點回調承諾使用async / await

[英]node callback to promise with async/await

我正在嘗試編寫一個將節點式回調函數轉換為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得到解決。

知道如何解決這個問題嗎?

從節點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

您的問題是您正在異步回調中構建 newPromise 所以當你歸還它時你仍然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);
    });
}

另請參閱如何將現有回調API轉換為承諾?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM