2012-07-27 8 views
6

Per favore scusate la mia giovinezza con il concetto di promesse. Sto usando il modulo Q in Node.js. Ho una funzione che intende richiamare una richiamata dopo aver eseguito tutti i passaggi necessari. Il problema si verifica quando voglio chiamare la funzione di callback all'interno della promessa Q.Interruzione di una promessa Q in Node.js durante l'esecuzione di una richiamata?

La mia funzionalità desiderata è poter richiamare il callback quando raggiungo il passaggio finale e non rientrare più nella catena di promesse. Pertanto, la richiamata tornerà alla sua operazione originale. Tuttavia, come ho codificato, la richiamata viene chiamata nel contesto della promessa. A questo punto, se il callback (diciamo) genera un errore, viene catturato dal gestore degli errori in questa funzione, che non è quello che voglio!

var updateDataStream = function(data, input, posts, stream, callback) { 

    // Pack all the items up... 
    Q.ncall(data._packStream, data, posts, stream) 
    // Upsert the cache into the database 
    .then(function(){ 
     return Q.ncall(data.upsert, data); 
    }) 
    // buffer the new input 
    .then(function(res){ 
     return Q.ncall(data.buffer, data, input); 
    }) 
    .then(function(final){ 
     callback(null, final); 
    }) 
    .fail(function(err){ 
     console.log('OHNOES!!!!!!!',err); 
    }).end(); 
} 

In questo contesto, un errore che si verifica all'interno della funzione di callback causa "OHNOES !!!!!" da stampare ....

risposta

4

C'è un metodo, nodeify che (facoltativamente) si interrompe da una catena di promesse e inoltra a una continuazione in stile NodeJS.

var updateDataStream = function(data, input, posts, stream, callback) { 

    // Pack all the items up... 
    return Q.ncall(data._packStream, data, posts, stream) 
    // Upsert the cache into the database 
    .then(function(){ 
     return Q.ncall(data.upsert, data); 
    }) 
    // buffer the new input 
    .then(function(res){ 
     return Q.ncall(data.buffer, data, input); 
    }) 
    .nodeify(callback); 

} 

Annotare il aggiunto "di ritorno" all'inizio della catena e il "nodeify (callback)", ha aggiunto alla fine.

Gli utenti non devono essere affatto saggi che si sta utilizzando Q a meno che non interrompano la richiamata, nel qual caso riceveranno invece una promessa.

Problemi correlati