Timeout en async / await

Estoy con Node.js y TypeScript y estoy usando async/await . Este es mi caso de prueba:

 async function doSomethingInSeries() { const res1 = await callApi(); const res2 = await persistInDB(res1); const res3 = await doHeavyComputation(res1); return 'simle'; } 

Me gustaría establecer un tiempo de espera para la función general. Es decir, si res1 tarda 2 segundos, res2 tarda 0,5 segundos, res3 tarda 5 segundos. Me gustaría tener un tiempo de espera después de 3 segundos, permítanme arrojar un error.

Con una llamada a setTimeout normal es un problema porque se pierde el scope:

 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'; } 

Y no puedo atraparlo con Promise.catch normal:

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

¿Alguna idea sobre cómo resolver?

Puede usar Promise.race para hacer un tiempo de espera:

 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 }) 

No puede usar setTimeout sin envolverlo en una promesa.

Ok, encontré esta forma:

 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; }); } 

¿Alguien tiene errores?

Lo que me huele un poco es que el uso de Promises como estrategia de asincronía nos enviará a asignar demasiados objetos que algunas otras necesidades de la estrategia, pero esto es fuera de tema.