2011-08-05 13 views

Odpowiedz

17

Używam również asynchronizacji. Aby ułatwić śledzenie błędów zaleca Ci wymienić swoje funkcje, zamiast mnóstwo funkcji anonimowych:

async.series([ 
    function doSomething() {...}, 
    function doSomethingElse() {...}, 
    function finish() {...} 
]); 

ten sposób dostaniesz więcej pomocnych informacji w ślady stosu.

+0

Dzięki, pomogło to. Czy znasz jakieś inne, które są dobre? –

+0

Innym, którego używałem, jest [Krok] (https://github.com/creationix/step), który jest całkiem niezły. Myślę, że async ma więcej opcji, które mogą lepiej pasować do różnych sytuacji. – evilcelery

-1

Czasami trudno jest umieścić wszystkie funkcje w tablicy. Kiedy masz tablicę obiektów i chcesz coś zrobić dla każdego obiektu, używam czegoś podobnego do poniższego przykładu.

czytaj więcej w: http://coppieters.blogspot.be/2013/03/iterator-for-async-nodejs-operations.html

var list = [1, 2, 3, 4, 5]; 
var sum = 0; 

Application.each(list, function forEachNumber(done) { 
    sum += this; 

    // next statement most often called as callback in an async operation 
    // file, network or database stuff 

    done(); // pass an error if something went wrong and automatically end here 

}, function whenDone(err) { 
    if (err) 
    console.log("error: " + err); 
    else 
    console.log("sum = " + sum); 

}); 

nazwać funkcji, ponieważ jest łatwiejszy do debugowania (i łatwiejsze do odczytania)

3

... jednak śledzenie błędów i różnych sposobów przekazywanie danych do kontroli przepływu powoduje czasami, że rozwój jest bardzo trudny.

I niedawno stworzyła prostą abstrakcję o nazwie "wait.for", aby wywołać funkcje async w trybie synchronizacji (na bazie włókien): https://github.com/luciotato/waitfor

Korzystanie wait.for, można użyć „try/catch "podczas gdy wciąż wywołujesz funkcje asynchroniczne, a ty zachowujesz zakres funkcji (nie ma potrzeby zamykania). Przykład:

function inAFiber(param){ 
    try{ 
    var data= wait.for(fs.readFile,'someFile'); //async function 
    var result = wait.for(doSomethingElse,data,param); //another async function 
    otherFunction(result); 
    } 
    catch(e) { 
    //here you catch if some of the "waited.for" 
    // async functions returned "err" in callback 
    // or if otherFunction throws 
}; 

zobacz przykłady na https://github.com/luciotato/waitfor

+0

Elegancki. Włókna poświęcają niewielką przenośność. Ale jest to jeden z najbardziej czytelnych [rozwiązań] (https://github.com/joyent/node/wiki/modules#user-content-wiki-async-flow) Widziałem, bez potrzeby pre-procesora . Dobra robota! – joeytwiddle

Powiązane problemy