5

Sto utilizzando aync.parallel per eseguire due funzioni in parallelo. Le funzioni richiedono i feed RSS. Quindi i feed RSS vengono analizzati e aggiunti alla mia pagina web.Node.JS async.parallel non attende fino al completamento di tutte le attività

Ma per qualche motivo async.parallel corre il metodo di callback senza attendere le due funzioni hanno completato

The documentation says:

Una volta che i compiti sono completati, i risultati vengono passati al finale callback come un array .

Il mio codice.

require('async').parallel([ function(callback) { 
     fetchRss(res, bbcOpts); // Needs time to request and parse 
     callback(); 
    }, function(callback) { 
     // Very fast. 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("Done!"); 
    }); 

In realtà ho solo "Fatto!" sulla mia pagina web. Perché?

Perché devo chiamare res.end()?

Il Node.JS documentation dice:

Il metodo, Response.End(), deve essere chiamata a ogni risposta.

Se non lo chiamo, la mia pagina Web verrà "scaricata" (intendo una barra di avanzamento nella riga dell'indirizzo del mio browser).

risposta

9

Suppongo che la funzione fetchRss sia asincrona: viene eseguita in un secondo momento e viene richiamata immediatamente la richiamata. È necessario inviare il callback per fetchRss:

function fetchRss(res, bbcOpts, callback) { 
    doSomething(); 
    callback(); 
} 

require('async').parallel([ function(callback) { 
     fetchRss(res, bbcOpts, callback); // Needs time to request and parse 
    }, function(callback) { 
     // Very fast. 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("Done!"); 
    }); 

Su un lato nota, si dovrebbe chiamare res.end() in ordine per il nodo di sapere che il messaggio è completa e che ogni cosa (header + corpo) è stato scritto. In caso contrario, il socket rimarrà aperto e attenderà per sempre un altro messaggio (motivo per cui il browser mostra una barra di avanzamento: non sa che la richiesta è terminata).

Problemi correlati