Come strutturare Promesse annidate

Ho una situazione in cui penso che l’unica scelta per me sia quella di annidare alcune promesse l’una dentro l’altra. Ho una promise che deve essere eseguita e un metodo che fa qualcosa finché quella promise non è completa. Qualcosa come questo:

let promise = new Promise((resolve, reject) => { // Do some stuff }); doSomethingUntilPromiseisDone(promise); 

Tuttavia, nell’ambito della mia promise, ho bisogno di eseguire un altro metodo che restituisca un’altra promise:

 let promise = new Promise((resolve, reject) => { fetchValue(url) .then((value) => { // Do something here }).catch((err) => { console.error(err); }); }); doSomethingUntilPromiseisDone(promise); 

Ma ora, nella fetchValue metodo fetchValue , ho un altro metodo che devo eseguire, indovina un po ‘, restituisce un’altra promise:

 let promise = new Promise((resolve, reject) => { fetchValue(url) .then((value) => { saveToCache(value) .then((success) => { console.log('success!!'); resolve('success'); }); }).catch((err) => { console.error(err); }); }); doSomethingUntilPromiseisDone(promise); 

Quindi alla fine, ho una promise, all’interno di una promise, all’interno di una promise. È in qualche modo ansible strutturarlo meglio in modo che sia più semplice? Sembra che annidarsi l’uno nell’altro sia in contrasto con l’approccio di concatenazione previsto da Promise.

Usa .then()

 let doStuff = (resolve, reject) => {/* resolve() or reject() */}; let promise = new Promise(doStuff); doSomethingUntilPromiseisDone( promise .then(value => fetchValue(url)) .then(value => value.blob()) .then(saveToCache) ) .then(success => console.log("success!!")) .catch(err => console.error(err)) 

puoi usare il generator per appiattire le tue promesse nidificate ( Bluebird.couroutine o Generators )

 //Bluebird.couroutine const generator = Promise.coroutine(function*() { try { const value = yield fetchValue(url); const success = yield saveToCache(value); console.log('success:', success); } catch(e) { console.error(err); } })); generator();