我使用Node.js和TypeScript,并且使用async/await。这是我的测试用例:
async/await
async function doSomethingInSeries() { const res1 = await callApi(); const res2 = await persistInDB(res1); const res3 = await doHeavyComputation(res1); return 'simle'; }
我想为整个功能设置一个超时时间。即如果要res1花费2秒,res2花费0.5秒,res3花费5秒,我想在3秒钟后让我抛出错误的超时。
res1
res2
res3
正常setTimeout调用是一个问题,因为范围丢失了:
setTimeout
async function doSomethingInSeries() { const timerId = setTimeout(function() { throw new Error('timeout'); }); const res1 = await callApi(); const res2 = await persistInDB(res1); const res3 = await doHeavyComputation(res1); clearTimeout(timerId); return 'simle'; }
而且我不能用普通的方式抓住它Promise.catch:
Promise.catch
doSomethingInSeries().catch(function(err) { // errors in res1, res2, res3 will be catched here // but the setTimeout thing is not!! });
有关如何解决的任何想法?
您可以使用Promise.race超时:
Promise.race
Promise.race([ doSomethingInSeries(), new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 11.5e3)) ]).catch(function(err) { // errors in res1, res2, res3 and the timeout will be caught here })
您必须setTimeout将其包装在诺言中才能使用。