2015-01-23 10 views
5

To jest konwencja w węźle przekazać parametr błędu operacji asynchronicznych:kontroli parametrów błędu w węźle

async.someMagicalDust(function(callback) { 
    // some asynchronous task 

    // […] 
    callback(); 

}, function(err) { 
    // final callback 

    if(err) throw err;  
    // […] 

}); 

Może jestem zbyt naiwny, ale nigdy nie byłem wielkim fanem notacji if(variable) - prawdopodobnie odziedziczony po C, z powodów, które have already been discussed many times in the past.

Z drugiej strony, mam czasami napotkał parametr null i ten czek o błędzie:

if(typeof err !== 'undefined' && err !== null) 

jest zbyt rozwlekły.

Innym rozwiązaniem byłoby

if(err != null) 

ale myślę, że non-strict check może być trudne, chociaż uważam, że to normalne przy porównywaniu z null.

Jaki jest najlepszy sposób sprawdzenia parametrów błędu w węźle?

Odpowiedz

2

Użyj if(err).

Przeznaczony jest do użytkowania w ten sposób. Połączenia zwrotne w stylu węzła mają ustawiać błąd na wartość niefałszowaną tylko w przypadku rzeczywistego błędu. Nie znajdziesz żadnego rozsądnego przykładu ustawienia err na '' lub 0 w celu oznaczenia błędu.

Podobnie jak YlinaGreed zauważył, czy konwencje Moduł cnahge z null do undefined do 0 do może nawet NaN, wciąż jesteś bezpieczny. Nigdy nie zostałem trafiony tym, że użyłem tylko if(err).

Z drugiej strony, może chcesz używać coffeescript, co przełożyłoby Ci

unless err? then... 

do

if (typeof err === "undefined" || err === null) { 

naśladując najczęściej wzór.

kilka linków do potwierdzać podejście if(err):

Konwencja wydaje się być przechodzącej błąd obiekt jako pierwszy argument i brak błędu, więc nawet jeśli przerzucisz pusty obiekt, nadal będzie to błąd.

Jeśli używasz popularnego szkieletu express, powinieneś był użyć wywołania zwrotnego , aby powrócić z oprogramowania pośredniego, które jest zgodne z konwencją wymuszania.

Sądzę, że większość osób woli bardziej zwięzły next() niż next(null), co oznacza, że ​​pierwszy argument oceni do undefined zamiast null, a to z pewnością zupełnie normalne użytkowanie.

+0

Czy poleciłbyś jednak drugi przykład nad err == null (nie ścisła równość, przynosząc taki sam wynik) –

+0

Polecam go tylko wtedy, gdy jest generowany automatycznie (np. Przez coffeescript). W przeciwnym razie czytelność kodu przeważa nad innymi względami. – punund

+0

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"? –

0

Dla mnie najlepszym sposobem obsługi błędów jest „if (err == null)” Jest to jedyny przypadek używam non ścisłego operatora, z tych powodów:

  • Jedynym nad rozwiązaniem, które zawsze działa jest bardzo szczegółowe, jak powiedziałeś przed
  • Możesz również sprawdzić tylko "null" lub "undefined", ale zrobiłem to raz, a kilka miesięcy później, właśnie zaktualizowałem swoje zależności i ... Konwencja uległa zmianie, a moduł wysyłał wartość null zamiast undefined.

To przede wszystkim kwestia "konwencji", mam swoje, a ty też masz swoje ... Tylko uważaj, aby wybrać jeden z dwóch "dobrych" sposobów.

0

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).