Sto usando babeljs con i metodi async/await in stile es7. Ho uno script principale che chiamerà un metodo asincrono su una serie di oggetti che restituiscono tutte le promesse. Io uso Promise.all() per attendere il ritorno di tutti quelli, tuttavia, queste attività potrebbero richiedere molto tempo e se superano una soglia vorrei interromperle tutte e il task gestirà ciò in modo appropriato.Possibilità di annullare la chiamata asincrona
Esiste comunque una cosa del genere? Attualmente l'unico modo a cui posso pensare è di generare un processo che faccia il lavoro di chiamare questi metodi e di attendere che tutti si risolvano, e se il limite di tempo è raggiunto, può uccidere il processo e fare qualsiasi cosa abbia bisogno.
Aggiornamento: alcuni chiarimenti su questi metodi su cui lo script principale è in attesa ... Potrebbero fare una lunga serie di operazioni (chiamare sistemi esterni, eseguire lo streaming di file da qualche parte, ecc.) E non eseguire una singola azione che potrebbe essere annullato indipendentemente
Aggiornamento # 2: Alcuni codice di semi-pseudo non testati
class Foo1 {
async doSomething() {
// call some external system
// copy some files
// put those files somewhere else (s3)
}
}
class Foo2 {
async doSomething() {
// Do some long computations
// Update some systems
}
}
class FooHandler {
constructor() {
this.fooList = [];
}
async start() {
await Promise.all(this.fooList.map(async (foo) => {
return await foo.doSomething();
}));
}
}
let handler = new FooHandler();
handler.fooList.push(new Foo1());
handler.fooList.push(new Foo2());
// if this call takes too long because of slow connections, errors, whatever,
// abort start(), handle it in whatever meaningful way, and continue on.
await handler.start();
Potresti pubblicare il tuo codice? –
Questa è un'ottima domanda su un problema reale, perché è downvoted? –
correlati: [Come cancellare una catena di promessa EMCAScript6 (vanilla JavaScript)] (http://stackoverflow.com/q/29478751/1048572) – Bergi