Sollte eine Promise.reject-Nachricht in Error eingeschlossen werden?

Lesezeit: 3 Minuten

Sollte eine Promisereject Nachricht in Error eingeschlossen werden
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

Sollte eine Promisereject Nachricht in Error eingeschlossen werden
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.

.

583510cookie-checkSollte eine Promise.reject-Nachricht in Error eingeschlossen werden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy