Sollte eine Promise.reject-Nachricht in Error eingeschlossen werden?
Lesezeit: 3 Minuten
Dominik
Verwenden des nativen (ES6) Versprechen. Soll ich mit einem ablehnen Fehler:
Promise.reject(new Error('Something went wrong'));
Oder sollte ich einfach mit einer Zeichenfolge ablehnen:
Promise.reject('Something went wrong');
Und was ist der Unterschied im Browserverhalten?
Ich glaube nicht, dass es einen Unterschied gibt. Sie lehnen einfach mit a ab Wert. Was dieser Wert ist und wie er verarbeitet werden soll, hängt von Ihrer Anwendung ab.
– Felix Klinge
24. September 14 um 15:20 Uhr
@FelixKling MDN sagt Für Debugging-Zwecke ist es sinnvoll, den Grund zu einer Instanz von Error zu machen – Es steht aber nicht warum, irgendwelche Ideen?
– CodingIntrige
24. September 14 um 15:21 Uhr
@RGraham: Wo steht das?
– Felix Klinge
24. September 14 um 15:24 Uhr
@RGraham: Wahrscheinlich aus dem Grund, den Benjamin in seiner Antwort erwähnt, um einen Stack-Trace zu erhalten. Allerdings ist das eine Eigenschaft von Error, nicht der Übergabe an Error widersprechen .reject(). Dem Browser oder JavaScript ist es immer noch egal, an was Sie übergeben .reject().
– Felix Klinge
24. September 14 um 15:31 Uhr
Auch in der Praxis nur throw new Error('Something went wrong')); denn innerhalb von Promise-Chains und Promise-Konstruktor-Executor-Funktionen wird dies zu einer Ablehnung.
– Fock
27. Mai 15 um 0:46 Uhr
Benjamin Grünbaum
Ja, das sollte es auf jeden Fall. Ein String ist kein Fehler, wenn Sie Fehler haben, bedeutet dies normalerweise, dass etwas schief gelaufen ist, was bedeutet, dass Sie einen guten Stack-Trace wirklich genießen würden. Kein Fehler – kein Stack-Trace.
Genau wie bei Try/Catch, wenn Sie hinzufügen .catch Zu einer geworfenen Ablehnung möchten Sie in der Lage sein, den Stack-Trace zu protokollieren, das Werfen von Zeichenfolgen ruiniert das für Sie.
Ich bin auf dem Handy, daher ist diese Antwort ziemlich kurz, aber ich kann wirklich nicht genug betonen, wie wichtig das ist. In großen Apps (10K+ LoC) machten Stack-Traces in Ablehnungen wirklich den Unterschied zwischen einfacher Fehlersuche aus der Ferne und einer langen Nacht im Büro.
Danke, ich arbeite auch an großen Apps, bin froh, dass jemand praktische Erfahrungen damit gemacht hat
– Dominik
24. September 14 um 15:56 Uhr
Ganz ehrlich? Betrachten Sie Bluebird, es hat bessere Stack-Traces, getippt catch, und unbenutzte Zurückweisungsverfolgung, die allesamt Killerfunktionen für das Debugging sind. ES6-Versprechen funktionieren unserer Erfahrung nach bisher nur in Firefox gut.
– Benjamin Grünbaum
24. September 14 um 16:04 Uhr
Update 2022: Bluebird nicht bevorzugen, alle Änderungen zum Debuggen wurden in native Versprechungen hochgeladen. (Fehler sollten zu 100% eingepackt werden new Error())
– Benjamin Grünbaum
5 Stunden zuvor
Ich empfehle es benutzen Error nur Objekt (kein String) zum Senden der Gründe.
Rechtfertigung
Andere Teile des Codes generieren die Errors innerhalb des Grundes für die Ablehnung des Versprechens …
Wenn ein Code fehlschlägt, gibt die Ausnahme die zurück Error Objekt. Auch wenn Sie eine externe Bibliothek aufrufen, die das Promise nicht unterstützt, wird es das werfen Error widersprechen, wenn etwas schief geht. Wenn einer der oben genannten Fehler im Promise auftritt, wird er umgewandelt in catch mit Error Objekt.
Wenn Sie also die verwenden string Als Versprechungsablehnungsgrund müssen Sie damit rechnen, dass der Fang bei Ihnen eintreten kann string (Teil Ihres Codes) oder Error (wenn ein allgemeiner Fehler auftritt). Sie müssen also hässlichen Code verwenden (err.message || err) überall, wenn Sie den Fehler behandeln müssen.
.
5835100cookie-checkSollte eine Promise.reject-Nachricht in Error eingeschlossen werden?yes
Ich glaube nicht, dass es einen Unterschied gibt. Sie lehnen einfach mit a ab Wert. Was dieser Wert ist und wie er verarbeitet werden soll, hängt von Ihrer Anwendung ab.
– Felix Klinge
24. September 14 um 15:20 Uhr
@FelixKling MDN sagt Für Debugging-Zwecke ist es sinnvoll, den Grund zu einer Instanz von Error zu machen – Es steht aber nicht warum, irgendwelche Ideen?
– CodingIntrige
24. September 14 um 15:21 Uhr
@RGraham: Wo steht das?
– Felix Klinge
24. September 14 um 15:24 Uhr
@RGraham: Wahrscheinlich aus dem Grund, den Benjamin in seiner Antwort erwähnt, um einen Stack-Trace zu erhalten. Allerdings ist das eine Eigenschaft von
Error
, nicht der Übergabe anError
widersprechen.reject()
. Dem Browser oder JavaScript ist es immer noch egal, an was Sie übergeben.reject()
.– Felix Klinge
24. September 14 um 15:31 Uhr
Auch in der Praxis nur
throw new Error('Something went wrong'));
denn innerhalb von Promise-Chains und Promise-Konstruktor-Executor-Funktionen wird dies zu einer Ablehnung.– Fock
27. Mai 15 um 0:46 Uhr