我在互联网上寻找答案,但找不到真正的答案。
我需要知道以下代码有什么问题(前提是我们应避免混合使用回调和Promise)-
function a(callback){
(async ()=>{
try{
let result = await doSomething();
callback(null, result);
} catch(e){
log('error at await');
callback(e, null);
}
})()
}
如果我在代码中使用上述模式,可以吗?
UPDATE
[好吧,基本上,我们正在尽最大努力避免出现“回调地狱”,因此请记住,我们需要重新思考在ES6 +中处理回调的方式。
[下面,我们通过返回对rap()的调用的输出,从传递给something.start()的回调中返回承诺。
这有意义吗? :)
rap = (fn, arg) => {
return new Promise((resolve, reject) => {
fn(arg, (e,r) => {
if(e) return reject(e) else return resolve(r)
})
})
}
const sink = async (_config) => {
await something.start('some stuff',(t) => {
return rap(someData, someMore)
.then( (r) => {
t.ok(r); //or w/e
return null
}).catch( err => throw new Error(err))
})
//do stuff
something.end()
return null
}
原始
此:
function fetchFirstUser(callback) {
knex.first().from("users").then((user) => {
callback(null, user);
}, callback);
// you could add a .catch(console.log) to see why it fails
}
it("should pass us a null if there are no users", function(done) {
fetchFirstUser(function(err, user) {
expect(err).to.be.null;
expect(user).to.be.null;
done();
});
});
成为:
it("should pass us a null if there are no users", async () => {
const user = await knex.first().from('users');
expect(user).to.be.null;
});
基本上是评论中所说的,但相反。大声笑
我可以在NodeJS中混合使用回调和异步/等待模式吗?
您可以。不推荐。
通常在混合回调和承诺时进行正确的错误处理会更加困难。另外,控制流可能真是一团糟。这个示例不太混乱,因为只有一个异步操作,但是为什么不只返回一个promise并加入现代异步设计并根本不使用任何简单的回调呢?此外,这里的等待是毫无意义的。您已经使事情变得比return doSomething()
复杂得多,并且让调用者使用返回的Promise。
因此,您可以用1条简单的行替换9条功能主体行(包括async
IIFE)。
不要混用简单的回调和承诺
async
库之类的库的原因),而这种级别的流控制是自然而然的,兑现承诺。然后,尝试将控制和错误处理流程的两个模型混合在一起,事情很快就会变得很复杂。