Timeout in async / await

Sono con Node.js e TypeScript e sto usando async/await . Questo è il mio caso di prova:

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

Mi piacerebbe impostare un timeout per la funzione generale. res1 dire se res1 impiega 2 secondi, res2 impiega 0,5 secondi, res3 impiega 5 secondi Mi piacerebbe avere un timeout che dopo 3 secondi mi permetta di lanciare un errore.

Con una normale chiamata setTimeout è un problema perché l’ambito è perso:

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

E non riesco a prenderlo con il normale Promise.catch :

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

Qualche idea su come risolvere?

È ansible utilizzare Promise.race per effettuare un timeout:

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

Non è ansible utilizzare setTimeout senza averlo setTimeout in una promise.

Ok ho trovato in questo modo:

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

Qualche errore?

Le cose che mi odono un po ‘sono che usare la strategia Promises asynchronicity ci invierà a destinare troppi oggetti che alcune altre strategie necessitano ma questo è fuori tema.