【发布时间】:2020-03-22 10:29:59
【问题描述】:
我正在努力解决我所面临的关于 async/await 和 Promises 的问题。我设法将我的问题归结为以下代码:
async function sleep(ms: number) {
return new Promise(resolve => {
setTimeout(resolve, ms);
});
}
async function fetchMock(): Promise<any> {
return new Promise(() => {
throw 'error fetching result';
});
}
async function main(): Promise<any> {
const kickedOffRequest = fetchMock();
await sleep(10);
return kickedOffRequest;
}
main()
.then(() => console.log('resolved promise!'))
.catch(error => console.error('caught error!', error));
我收到以下警告:
(node:82245) UnhandledPromiseRejectionWarning: error fetching result
(node:82245) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:82245) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
caught error! error fetching result
(node:82245) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1)
您可以观察到相同的问题in this sandbox。我注意到注释掉await sleep(10) 解决了这个问题,但显然我对承诺的了解比我想象的要少。为什么评论该行会使我的程序正常工作?我很想问如何修复Promise rejection was handled asynchronously 错误,但我希望一旦我了解await sleep(10) 如何导致我得到的错误,我将能够自己修复这个错误。
提前感谢您花时间阅读/回答这个问题!
【问题讨论】:
-
@Bergi - 我看不到您标记的副本实际上如何为这个特定问题提供解决方案。 OP 在
main()中似乎想要的是从fetchMock()返回承诺,无论是被拒绝还是已解决,但直到至少 10 毫秒过去后才解决或拒绝。我不明白如何在你的重复中做到这一点。因此,如果fetchMock()立即解析或拒绝,则从main()返回的承诺在 10 毫秒内不会解析或拒绝。但是,如果来自fetchMock()的承诺花费了超过 10 毫秒来解决或拒绝,则不会在该解决或拒绝中增加进一步的延迟。 -
@jfriend00 对我来说,不清楚 OP 真正想要什么行为,但欺骗是我们的规范解释为什么当前的尝试不起作用以及为什么应该使用
Promise.all -
好吧,
Promise.all()没有明显的用途,它创建了main()显示的确切时间。 Canonical answers 适用于规范问题,而不是引发不同变体且规范答案中未显示解决方案的问题。 -
@jfriend00 这正是我想要的,谢谢。在我的“真实”程序中,我启动了一个网络请求,然后休眠了一段时间。我现在不想等待我的网络请求,所以
Promise.all不是我想要的东西。 -
您是否想要一个与您描述的一样的答案 - 包括拒绝返回的承诺而不是您已经接受的答案中的解决方法?我想出了一个办法,但我需要一些时间来确保它正常工作。
标签: javascript error-handling promise async-await