[英]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.