2015-06-19 8 views
7

Ho una catena promessa con una promessa ricorsivo doAsyncRecursive() al centro in questo modo:concatenamento promessa ricorsiva con un uccello azzurro

doAsync().then(function() { 
    return doAsyncRecursive(); 
}).then(function() { 
    return doSomethingElseAsync(); 
}).then(function(result) { 
    console.log(result); 
}).catch(errorHandler); 

doAsyncRecursive() ha a che fare qualcosa e se in un primo momento non riesce, io poi dopo voglio provare ogni 5 secondi finché non lo fa. Questo è ciò che la mia funzione promessa assomiglia:

function doAsyncRecursive() { 
    return new Promise(function(resolve, reject) { 
     //do async thing 
     if (success) { 
      resolve(); 
     } else { 
      return new Promise(function(resolve, reject) { 
       setTimeout(function() { 
        doAsyncRecursive(); 
       }, 5000); 
      }); 
     } 
    }); 
} 

Ma quando eseguo, la catena non continuare dopo doAsyncRecursive() è successo al 2 ° tentativo e resolve() è chiamata (continua se il tentativo va a buon fine al 1 ° prova però).

Quale motivo ho bisogno per fare questo lavoro?

risposta

7

Verificare l'errore, attendere cinque secondi, quindi riprovare.

function doAsyncRecursive() { 
    return doAsyncThing().catch(function() { 
     return Promise.delay(5000).then(doAsyncRecursive); 
    }); 
} 

Qui doAsyncThing è una funzione corrispondente al //do async thing commento nel codice del PO, definito come ritorno una promessa. Nel codice originale, il successo o l'insuccesso della "cosa asincrona" viene testato usando un flag success, ma per definizione le routine asincrone non forniscono tale flag; consegnano i loro risultati tramite una callback o una promessa. Il codice sopra presuppone che doAsyncThing restituisca una promessa. Assume anche che il "fallimento", nel senso di "non restituisce la risposta che voglio", è rappresentato da quella promessa di rifiuto. Se invece "successo" o "fallimento" devono essere definiti come un valore particolare di una promessa soddisfatta, allora vorresti fare

function doAsyncRecursive() { 
    return doAsyncThing().then(function(success) { 
     if (success) return success; 
     else return Promise.delay(5000).then(doAsyncRecursive); 
    }); 
} 
+0

scusa ma ho problemi a capire questa soluzione perché non so cosa tu significa dalla chiamata async(). forse non ero chiaro - doAsync() e doAsyncRecursive() sono funzioni completamente diverse che fanno diverse attività asincrone, e doAsyncRecursive() sta provando a chiamare doAsyncRecursive() ancora e ancora quando non restituisce la risposta che voglio. era questa la tua comprensione? –

+0

grazie per l'aggiornamento. Ho modificato il mio codice per rifiutare la mia promessa in base a una condizione di test e ho creato una funzione wrapper simile che restituisce la promessa asincrona come suggeriva e ora funziona! Ora vedo come tutto passa per restituire una promessa così la catena può continuare. evviva :) –

+0

Questa soluzione perde memoria su ogni 'catch()'. – kikap