Javascript 在等待的承诺中抛出的错误未在catch块中捕获

Javascript 在等待的承诺中抛出的错误未在catch块中捕获,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我在一个try/catch块中得到了两个承诺,之后还有第三个函数使用等待的响应 当Iwaitres1和res2在lastFunction的参数内时,抛出的错误不会被catch块捕获 当我通过const res2=await promise2()正常等待它们时,错误被捕获到catch块中 为什么会这样 consthandler=async()=>{ const results=等待承诺。全部( [1] .map(异步id=>{ 试一试{ const res1=promise1() const re

我在一个try/catch块中得到了两个承诺,之后还有第三个函数使用等待的响应

当I
wait
res1和res2在lastFunction的参数内时,抛出的错误不会被catch块捕获

当我通过
const res2=await promise2()
正常等待它们时,错误被捕获到catch块中

为什么会这样

consthandler=async()=>{
const results=等待承诺。全部(
[1] .map(异步id=>{
试一试{
const res1=promise1()
const res2=promise2()
const finalResponse=wait last函数(wait res1,wait res2)
}捕捉(错误){
console.log('捕获错误')
console.log(错误)
}
})
)
}
const promise1=()=>{
返回新承诺((res,rej)=>{
设置超时(()=>res(1),1000)
})
}
const promise2=()=>{
返回新承诺((res,rej)=>{
抛出新错误('第二个已断开')
})
}
常量lastFunction=(prom1,prom2)=>{
返回新承诺((res,rej)=>{
res(‘完成’)
})
}
handler();

CodePen:(打开控制台)

promise2
是一个错误,不是拒绝承诺。无论您在哪里等待它,它仍然不会捕获错误,因为错误源于承诺。如果您更改
promise2
以正确地拒绝承诺(
rej(“第二个坏掉”)
而不是
抛出新错误(“第二个坏掉”)
),那么您会注意到
catch
实际上是有效的。

我担心,如果我在函数调用之前放置
wait
,它会正确地捕捉到它。你可以用这样的笔来测试这个,我有,但它没有发现错误。啊,我的错。我不能像我想的那样在代码笔中复制它。有些不同,我会看看我的代码和你的建议。“错误源于承诺”-为了澄清,我会说错误是从
setTimeout
回调抛出的,而不是从承诺抛出的。承诺完全不受影响,没有被拒绝。在某些上下文中,我使用catch是因为我在
promise1()
promise2()
中进行HTTP调用,我将错误处理交给调用方处理。那么也许Bergi很接近?抱歉,我之前不认为这是相关的。所以这篇文章为我解答了这个问题。这与多个
wait
s的错误处理有关,而不是使用
promise.all()