2012-10-29 38 views
5

Zaczynam uczyć się node.js i agregować wiele kanałów rss w jednym, przygotowuję kanały, a następnie odtwarzam unikalny kanał z danych, które przygotowałem.Wartość zwracana w async.forEach w węźle js?

Tak więc, aby obsłużyć wiele żądań http asynchronicznie, używam https://github.com/caolan/async#forEach, która wykonuje zadanie.

Ale nie mogę wymyślić, jak zwrócić wartość (źródło rss xml w moim przypadku).

Oto mój kod:

function aggregate(topic) { 
    async.forEach(topic.feeds, 
    function(item, callback) { 
     parseAndProcessFeed(item, callback); 
    }, 
    function(err) { 
     // sort items by date 
     items.sort(function(a, b) { 
     return (Date.parse(b.date) - Date.parse(a.name)); 
     }); 
     var rssFeed = createAggregatedFeed(); 
     console.log(rssFeed); 
     return rssFeed; 
    } 
); 
} 

z console.log(rssFeed) widzę kanału RSS, więc myślę, że brakuje czegoś oczywiste.

Jak mogę zwrócić wartość rssFeed?

Pomoc w odzyskaniu mnie na stanowisku będzie świetna, dzięki!

Xavier

Odpowiedz

8

Nie można zwrócić wartości z funkcji asynchronicznej. Musisz przekazać go do funkcji zwrotnej. W ten sposób:

function aggregate(topic, callback) { 
    async.forEach(topic.feeds, 
    function(item, callback) { 
     parseAndProcessFeed(item, callback); 
    }, 
    function(err) { 
     // sort items by date 
     items.sort(function(a, b) { 
     return (Date.parse(b.date) - Date.parse(a.name)); 
     }); 
     var rssFeed = createAggregatedFeed(); 
     callback(err, rssFeed); 
    } 
); 
} 

aggregate(someTopic, function(err, result) { 
    // here is result of aggregate 
}); 
+0

Dzięki! Oto oczywistość, której mi brakowało! Mój kanał RSS działa! great –

+0

Czy "items" zostało zadeklarowane gdzieś i wywołane z 'parseAndProcessFeed', które robi coś takiego jak' items.push (item) '? –