Javascript promise中的异步函数抛出错误且不拒绝

Javascript promise中的异步函数抛出错误且不拒绝,javascript,asynchronous,error-handling,promise,catch-block,Javascript,Asynchronous,Error Handling,Promise,Catch Block,如果有一个包含异步函数的承诺,并且在异步函数中发生了错误,那么承诺不会捕获,而是抛出错误并使应用程序崩溃,我不理解这一点 很明显,我想处理这个错误,你知道为什么承诺会这样做,有什么办法可以绕过它吗 谢谢 //由于未定义参数,此承诺将有错误, //承诺不会被兑现 随机函数{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 参数[0]=11; }, 2000; }; } 随机承诺 .然后=>{ console.log'nothing'; } .catch=>{ console.log

如果有一个包含异步函数的承诺,并且在异步函数中发生了错误,那么承诺不会捕获,而是抛出错误并使应用程序崩溃,我不理解这一点

很明显,我想处理这个错误,你知道为什么承诺会这样做,有什么办法可以绕过它吗

谢谢

//由于未定义参数,此承诺将有错误, //承诺不会被兑现 随机函数{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 参数[0]=11; }, 2000; }; } 随机承诺 .然后=>{ console.log'nothing'; } .catch=>{ console.log“如果在promise中设置了超时或任何异步函数,则由'param[0]=11;\'引起的错误不会将此处的控件带入catch块,只会抛出一个错误并使应用程序崩溃”; console.loge; }; //由于未定义参数,此承诺将有错误 //但这一承诺将被兑现 函数RandomisePromiseToCatchBlockParam{ 返回新的PromiseSolve,拒绝=>{ 参数[0]=11; }; } 随机允诺块 .然后=>{ console.log'nothing'; } .catch=>{ console.log“如果没有setTimeout函数或任何异步函数,\'param[0]=11;\'导致的错误会将此处的控件带入catch块”; console.loge;
}; 在承诺构造函数中抛出并异步发生的错误需要显式try/catch,以便可以调用reject,从而将承诺控制流传输到承诺的catch。例如:

//此承诺将有错误,因为未定义param,并且该承诺不会被捕获 随机函数{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 试一试{ 参数[0]=11; }抓住{ 拒绝; } }, 2000; }; } 随机承诺 .catch=>{ console.loge.message;
}; 在承诺构造函数中抛出并异步发生的错误需要显式try/catch,以便可以调用reject,从而将承诺控制流传输到承诺的catch。例如:

//此承诺将有错误,因为未定义param,并且该承诺不会被捕获 随机函数{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 试一试{ 参数[0]=11; }抓住{ 拒绝; } }, 2000; }; } 随机承诺 .catch=>{ console.loge.message;
};因此,创建承诺的线程已经结束了——我认为Javascript没有多线程。你能再解释一下当异步方法抛出异常时Javascript内部会发生什么吗?是的,在大多数情况下,Javascript是单线程的。也许更合理的说法是错误发生在事件循环的不同迭代中。如果在异步执行过程中抛出错误,并且同步调用堆栈从开始。然后,它将导致对此的承诺。然后拒绝,如果处理不当,将导致未经处理的退出。否则,如果没有。那么在同步调用堆栈中,例如,这里,当抛出错误时,同步调用堆栈的顶部是setTimeout回调,它将导致一个标准错误。酷,让我们看看我是否理解这一点。当异步函数运行时,例如setTimeout,事件循环不知道它正在承诺内运行。因此,异步调用中的错误将使程序崩溃。但是,如果我们通过调用Promise的reject来专门处理错误,它会将控件传递回Promise,从而避免程序崩溃。由于它不在主线程上,它可能不会使程序崩溃,它只会记录有错误。如果调用reject,或在.内同步抛出,则会将错误传递给要处理的承诺。如果这个错误没有得到承诺的处理,你将得到一个未经处理的拒绝。未经处理的拒绝的错误消息是不同的,但是发生了相同的一般情况-抛出了一个未捕获的错误。因此创建承诺的线程已经结束-我认为Javascript没有多线程。你能再解释一下当异步方法抛出异常时Javascript内部会发生什么吗?是的,在大多数情况下,Javascript是单线程的。也许更合理的说法是错误发生在事件循环的不同迭代中。如果在异步执行过程中抛出错误,并且同步调用堆栈从开始。然后,它将导致对此的承诺。然后拒绝,如果处理不当,将导致未经处理的退出。否则,如果没有。那么在同步调用堆栈中,例如,这里,抛出错误时同步调用堆栈的顶部是setTimeout callbac
k、 这将导致标准错误。酷,让我们看看我是否理解这一点。当异步函数运行时,例如setTimeout,事件循环不知道它正在承诺内运行。因此,异步调用中的错误将使程序崩溃。但是,如果我们通过调用Promise的reject来专门处理错误,它会将控件传递回Promise,从而避免程序崩溃。由于它不在主线程上,它可能不会使程序崩溃,它只会记录有错误。如果调用reject,或在.内同步抛出,则会将错误传递给要处理的承诺。如果这个错误没有得到承诺的处理,你将得到一个未经处理的拒绝。未经处理的拒绝的错误消息是不同的,但是发生了相同的一般情况-抛出了一个未捕获的错误。