2016-03-23 5 views
1

Rückkehr Ich finde mich viel versprechend Code zu schreiben, die Fälle behandelt, wo Daten nicht verfügbar sein kann, und ich bin mir nicht sicher, ob NULL-Werte zu übergeben oder werfen/catch in diesem Fall.Bedingte Rückkehr mit Versprechungen: Werfen gegen null

Zum Beispiel:

users.getById(id).then((user) => { 
    if (!user) { 
    return null; 
    } 
    return doSomething(user); 
}); 

könnte als

users.getById(id).then((user) => { 
    return doSomething(user); 
}).catch((e) => { 
    // User wasn't found 
}); 

entweder dieser im Allgemeinen bevorzugt sind geschrieben werden oder idiomatische in irgendeiner Weise, oder ist es am besten meine Instinkte in jedem Fall zu folgen?

+0

Der zweite sieht schöner aus –

Antwort

2

Wenn eine Funktion users.getById dann sollte sein Rückruf ein Benutzerobjekt hat, Zeit genannt wird. Das Versprechen, ein Benutzerobjekt zu erhalten, wird nur erfüllt, wenn Sie tatsächlich ein Benutzerobjekt erhalten.

Wurf typed Error instances verschiedene Fehlerzustände anzuzeigen.

users.getById(id).then((user) => { 
    return doSomething(user); 
}).catch((e) => { 
    switch (e.Name) { 
     case "UserNotFound": 
      // User wasn't found 
      break; 
     default: 
      // unexpected error 
    } 
}); 

Die bluebird Versprechen Bibliothek hat explicit support for typed exceptions und separaten support for catching operational errors, können Sie dieses Verhalten nachahmen kann. Oder Sie könnten nur verwenden drossel:

users.getById(id).then((user) => { 
    return doSomething(user); 
}).error(UserNotFound, (e) => { 
    // User wasn't found 
}).catch((e) => { 
    // unexpected error 
}); 
1

Wenn dies ein API-Aufruf ist, in der Regel, Sie wollen den Ball Teil für die Verbraucher zu retten, und nicht intern behandeln.

... oder handhaben die convert-to-JSON intern Teil, aber wenn es das Laden-Fehler sind, oder Konvertierungsfehler, lassen Sie die Außenwelt mit den oops leben.

Hier ist was ich meine; wir Versprechen für eine zweite Überspringen:

function getData() { 
    var data = null; 
    try { 
    data = getSomeData(); 
    } catch (e) { } // ignore it 

    return data; 
} 


var data = getData(); 
var name = data.property.name; // BOOM 

Wenn es werfen geht, sollten Sie es fangen (es wäre besser, wenn sie nicht werfen, aber besser zu wissen, dass es zu werfen, geht als nicht kennt).

function getData() { 
    var data = getSomeData(); 
    return data; 
} 


var data; 
var name; 
try { 
    data = getData(); 
    name = data.property.name; 
} catch (e) { /* now at the right level */ } 

Werfen im Allgemeinen ist natürlich nicht großartig. Es ist auch nicht null, abhängig von Ihrer Einstellung zur funktionalen Programmierung.

Wenn wir aus diesem einen Anruf, dass ein Versprechen zurück:

function getData() { 
    return callServer() 
    .then(response => JSON.parse(response)); 
} 

getData() 
    .then(showData) 
    .catch(showError); 

Wenn diese Fehler innerhalb behandelt wurden, wäre es nie zu dem Endbenutzer macht es die Tatsache zu handhaben, dass ihr Material fehlt. Wenn Sie null zurückgegeben haben, müssten sie alle Arten von null-Prüfungen innerhalb ihrer then() machen.