【发布时间】:2019-01-26 00:22:20
【问题描述】:
在处理 JavaScript 中的异步函数时。我发现了这个问题。
函数需要执行一些异步任务,但是该任务对函数结果没有影响。所以函数返回它的结果,一段时间后,异步函数抛出异常,但是由于控制已经返回,所以异常没有处理。
注意:不要更改notify我故意抛出这样的错误,只需要处理这个异常
代码如下:
function notify() { //To send notification
setTimeout( function() { //Just to simulate an asynchronous function
throw "Exception occurred"; //An exception from async function
},2000);
return "Notified";
}
try {
let result = notify();
console.log(result); //Notified
}
catch (error) { //Never comes to catch block.
console.log(error);
}
如何捕捉这个异常。 尝试使用 Promise,但它不能通过 Promise 解决,因为即使使用 Promise,由于调用函数已收到响应,流或函数也会从内存中删除。
使用承诺的代码
function notify() { //To send notification
return new Promise ( (resolve, reject) => {
setTimeout( function() { //Just to simulate an asynchronous function
throw "Exception occurred"; //An exception from async function
},2000);
resolve("Notified");
});
}
notify()
.then( result => {
console.log(result); //Notified
})
.catch( error => { //Never comes to catch block
console.log(error);
});
如何在 JavaScript 编程中捕获异常?
【问题讨论】:
-
我将首先重新评估您最初的说法,即“任务对功能结果没有影响”。如果在尝试发送通知时发生异常,那么知道是否成功的结果显然取决于该异步任务。
-
我认为this post 应该回答你的问题
-
notify不应立即resolve()。它应该调用reject()而不是throw处理异常。
标签: javascript node.js ecmascript-6 es6-promise ecmascript-5