当我在节点中创建异步功能并使用等待时,我正在执行等待承诺解析(可能是解决或拒绝),我所做的是放一个在try / catch块中等待保证,并在拒绝承诺的情况下抛出错误。问题是,当我在try / catch块中调用此异步函数以捕获错误时,我得到 UnhandledPromiseRejectionWarning 。但是使用等待的重点不在于等待解决并返回结果的承诺?看起来我的异步函数正在返回一个承诺。
示例 - 代码 UnhandledPromiseRejectionWarning :
let test = async () => {
let promise = new Promise((resolve, reject) => {
if(true) reject("reject!");
else resolve("resolve!");
});
try{
let result = await promise;
}
catch(error) {
console.log("promise error =", error);
throw error;
}
}
let main = () => {
try {
test();
}
catch(error){
console.log("error in main() =", error);
}
}
console.log("Starting test");
main();
答案 0 :(得分:4)
async functions 总是返回promises。事实上,他们总是返回原生承诺(即使你返回蓝鸟或常数)。 async / await的目的是减少.then
回调地狱的版本。您的程序仍然必须在主函数中至少有一个.catch
来处理任何到达顶部的错误。
顺序异步调用非常好,例如;
async function a() { /* do some network call, return a promise */ }
async function b(aResult) { /* do some network call, return a promise */ }
async function c() {
const firstRes = (await (a() /* promise */) /* not promise */);
const secondRes = await b(firstRes/* still not a promise*/);
}
如果不在函数内部,你就不能await
。通常这意味着您的main
函数或init
或您称之为的任何函数都不是异步的。这意味着它无法调用await
并且必须使用.catch
来处理任何错误,否则它们将是未处理的拒绝。在节点版本的某个时刻,这些将开始取出您的节点进程。
将async
视为返回原生承诺 - 无论 - 和await
将“承诺”同步展开。
注意异步函数返回本机承诺,它们不会同步解析或拒绝:
Promise.resolve(2).then(r => console.log(r)); console.log(3); // 3 printed before 2
Promise.reject(new Error('2)).catch(e => console.log(e.message)); console.log(3); // 3 before 2
异步函数将同步错误作为被拒绝的承诺返回。
async function a() { throw new Error('test error'); }
// the following are true if a is defined this way too
async function a() { return Promise.reject(new Error('test error')); }
/* won't work */ try { a() } catch(e) { /* will not run */ }
/* will work */ try { await a() } catch (e) { /* will run */ }
/* will work */ a().catch(e => /* will run */)
答案 1 :(得分:-1)
Main必须是一个异步函数才能捕获异步错误
// wont work
let main = () =>{
try{
test();
}catch(error){
console.log("error in main() =", error);
}
}
// will work
let main = async () =>{
try{
test();
}catch(error){
console.log("error in main() =", error);
}
}