2016-02-22 26 views
5

Così sto cercando di trasferire il mio codice nel "mondo Promise", e in molti luoghi in cui ho dovuto "loop" con la funzionalità asincrona - ho semplicemente usato la ricorsione in modo taleAsync ricorsiva utilizzando promessa

function doRecursion(idx,callback){ 
    if(idx < someArray.length){ 
     doAsync(function(){ 
      doRecursion(++idx,callback) 
     }); 
    }else{ 
     callback('done!') 
    } 
} 
doRecursion(0,function(msg){ 
    //... 
}); 

Ora sto cercando di fare il cambiamento nel mondo Promessa, e sono abbastanza bloccato

var Promise = require('bluebird') 
function doRecursion(idx){ 
    return new Promise(function(resolve){ 
     if(idx < someArray.length){ 
      doAsync(function(){ 
       //... doRecursion(++idx) 
       // how do i call doRecusion here.... 
      }); 
     }else{ 
      resolve('done!') 
     } 
    }); 
} 
doRecursion(0).then(function(msg){ 
    //... 
}); 

Grazie.

+2

'determinazione (doRecursion (++ IDX));' - se si risolve promessa 1 con Promessa 2, quindi promessa 1 si risolverà con il valore risolto della Promessa 2 –

+0

Si prega di smettere di usare il [promessa costruttore anti- Reticolo] (http://stackoverflow.com/q/23803743/918910). Questo vale anche per le risposte. – jib

risposta

4

Mi piacerebbe andare con l'approccio Promise.all.

Ciò che fa è attendere che tutte le promesse nell'array siano risolte. La mappa applicherà il metodo asincrono a ciascun elemento dell'array e restituirà una promessa.

function doAsyncP() { 
    return new Promise((resolve) => { 
     doAsync(function() { 
      resolve(); 
     }); 
    }); 
} 

Promise.all(
    someArray.map(doAsyncP) 
).then((msg) => { 
    //we're done. 
}); 
1

Nella funzione ricorsiva, si può fare questo:

... 
if (idx < someArray.length) { 
    doAsync(function() { 
    resolve(doRecursion(idx + 1)); 
    }); 
} else { 
... 

In altre parole, mentre idx è inferiore a someArray.length, la promessa si risolverà ad un'altra promessa, questa volta la promessa restituito chiamando doRecursion() con una idx incrementato di uno. La callback then in basso non verrà chiamata fino a quando doRecursion non si risolverà in un valore diverso da una promessa. In questo caso, alla fine verrà risolto con un valore di 'done!'.

Detto questo, se si utilizzano le promesse, probabilmente non è necessario ricorrere alla ricorsione. Potrebbe essere necessario rifattorizzare il codice un po 'di più, ma suggerirei di considerare la risposta di @ BenFortune come alternativa.

+0

Bit di un IMO anti-pattern se stai usando promesse. –

+0

@BenFortune Sì, sono d'accordo, ma è quello che ha chiesto il richiedente. Non ho mai pensato di utilizzare la ricorsione con le promesse prima, e questo è probabilmente il motivo. Il richiedente dovrebbe prendere in considerazione l'accettazione della risposta. – McMath

Problemi correlati