下面的代码行能够捕获错误(因为它是同步的)
new Promise(function(resolve, reject) {
throw new Error("Whoops!");
}).catch(alert);
但是当我如下修改代码时
new Promise(function(resolve, reject) {
setTimeout(() => {
throw new Error("Whoops!");
}, 1000);
}).catch(alert);
它无法捕获错误。 我有一个要捕获此错误的用例。我该如何实现?
通过链接“ https://bytearcher.com/articles/why-asynchronous-exceptions-are-uncatchable/”,我能够理解为什么会这样。只是想知道仍然有解决此错误的解决方案。
请注意,通过使用setTimeout,我指出了异步调用的使用,它可以给出一些响应,也可以提供错误,就像我在fetch语句中提供错误的URL一样。
fetch('api.github.com/users1') //'api.github.com/user'is correct url
.then(res => res.json())
.then(data => console.log(data))
.catch(alert);
答案 0 :(得分:2)
您将需要try
内的catch
/ setTimeout
您要让new Promise(function(resolve, reject) {
setTimeout(() => {
try {
throw new Error("Whoops!"); // Some operation that may throw
} catch (e) {
reject(e);
}
}, 1000);
}).catch(alert);
调用的函数:
setTimeout
函数throw new Error("Whoops!")
的调用完全独立于promise executor函数的执行上下文。
在上文中,我假设throw
是可能引发错误的操作的替代品,而不是实际的throw
语句。但是,如果您实际上是在进行reject
,则可以直接致电new Promise(function(resolve, reject) {
setTimeout(() => {
reject(new Error("Whoops!"));
}, 1000);
}).catch(alert);
:
SELECT col1, col2, REPEAT(col1, col2)
FROM table1
答案 1 :(得分:2)
使用拒绝抛出错误,
manage_stock
答案 2 :(得分:0)
要处理错误,请将try-catch放在setTimeout处理程序内:
new Promise(function(resolve, reject) {
setTimeout(() => {
try{
throw new Error("Whoops!");
}catch(alert){
console.log(alert);
}
}, 1000);
});
答案 3 :(得分:0)
您还可以使用一个小实用程序:
function timeout(delay){
return new Promise(resolve => setTimeout(resolve, delay));
}
timeout(1000)
.then(() => {
throw new Error("Whoops!");
})
.catch(alert);