Podstawowa konwencja wywołania zwrotnego węzła to przekazanie funkcji o numerze err
jako pierwszego parametru. Z mojego doświadczenia wynika, że zawsze można bezpiecznie sprawdzić, czy błąd jest zgodny z prawdą - w praktyce, jeśli błąd pojawi się null, gdy wystąpi błąd, problem leży bardziej w implementacji. Zawsze oczekiwałbym, że jeśli err
ma wartość NULL, nie wystąpił błąd. Może to być mylące ze względu na użycie oddzielnych funkcji dla błędów i sukcesów, co jest bardziej w stylu JQuery.Ajax i obietnic. Zwykle znajduję podwójne wywołania zwrotne, które są zbyt trudne do połączenia.
Biorąc pod uwagę twój przykład, wydaje się, że używasz biblioteki asynchronicznej, która jest doskonała. Jeśli szukam wykonać opcję równoległego to jak mam go ustawić:
function doAThing(callback) {
var err;
// do stuff here, maybe fill the err var
callback(err);
}
function doAsyncThings(callback) {
var tasks = [function(done) { // stuff to do in async
doAThing(function(err) {
done(err);
});
}];
async.parallel(tasks, function(err) { // single callback function
callback(err); // I send the error back up
});
}
Zauważ, że zamiast rzucać się błąd I przepuszcza się go z powrotem w górę łańcucha żądania. Istnieje kilka przypadków, w których chciałbym rzucić błąd, ponieważ zasadniczo mówisz "crash całej aplikacji".
Uważam, że jest prostsze i zmniejsza ilość parametrów, których należy użyć do wywoływania funkcji. Podczas korzystania z tej konwencji na wskroś można uprościć, po prostu przekazując zwrotnego jako parametr zamiast tworzyć nową funkcję anonimową, tak:
function doAThing(callback) {
var err;
// do stuff here, maybe fill the err var
callback(err);
}
function doAsyncThings(callback) {
var tasks = [function(done) { // stuff to do in async
doAThing(done);
}];
async.parallel(tasks, callback); // the error is sent back to the original function
}
Uważam, że generalnie chcesz obsługiwać te błędy w funkcjach one są wywoływane. Tak więc w tym przypadku osoba dzwoniąca pod numerem doAsyncThings
może sprawdzić, czy wystąpił błąd i obsłużyć go zgodnie z własnym zakresem (i być może dostarczyć lepszej informacji użytkownikowi, jeśli jest to API).
Czy poleciłbyś jednak drugi przykład nad err == null (nie ścisła równość, przynosząc taki sam wynik) –
Polecam go tylko wtedy, gdy jest generowany automatycznie (np. Przez coffeescript). W przeciwnym razie czytelność kodu przeważa nad innymi względami. – punund
Myślę, że to właściwe podejście. Czy możesz znaleźć oficjalne źródło/odniesienie dla "jest przeznaczony do użycia w ten sposób"? –