Тайм-аут в async / wait

Я с Node.js и TypeScript, и я использую 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 секунды позволяет мне выкинуть ошибку.

С обычным вызовом 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 :

 doSomethingInSeries().catch(function(err) { // errors in res1, res2, res3 will be catched here // but the setTimeout thing is not!! }); 

Любые идеи о том, как их решить?

Вы можете использовать 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 не обернув его promiseм.

Хорошо, я нашел этот способ:

 async function _doSomethingInSeries() { const res1 = await callApi(); const res2 = await persistInDB(res1); const res3 = await doHeavyComputation(res1); return 'simle'; } async function doSomethingInSeries(): Promise { let timeoutId; const delay = new Promise(function(resolve, reject){ timeoutId = setTimeout(function(){ reject(new Error('timeout')); }, 1000); }); // overall timeout return Promise.race([delay, _doSomethingInSeries()]) .then( (res) => { clearTimeout(timeoutId); return res; }); } 

Какие-то ошибки?

То, что немного пахнет мне, заключается в том, что использование обещаний в качестве страtagsи асинхронности направит нас на выделение слишком большого количества объектов, которые нужны какой-то другой страtagsи, но это не по теме.

  • Как читать и анализировать CSV-файлы на C ++?
  • Вертикальная (повернутая) метка в Android
  • Чтобы нарисовать подчеркивание под TextView в Android
  • андроидный эллипсовый многострочный текст
  • Как эффективно анализировать CSV-файл в Perl?
  • Эффективность анализа (если, TryParse, Try-Catch)
  • Как добавить разрыв строки в Android TextView?
  • Извлечение текста OpenCV
  • Сортировка текстового файла по длине строки, включая пробелы
  • Как печатать цвет в консоли с помощью System.out.println?
  • Java отрицательный int для шестнадцатеричного и обратного сбоев
  • Давайте будем гением компьютера.