Sollte ich die asynchrone Abweisung von Promise vermeiden?

8

Ich habe gerade Node v7.2.0 installiert und gelernt, dass der folgende Code:

%Vor%

führt zu dieser Nachricht:;

%Vor%

Ich verstehe die Gründe dafür, da viele Programmierer wahrscheinlich die Frustration eines Error erlebt haben, das von einem Promise verschlungen wurde. Aber dann habe ich dieses Experiment gemacht:

%Vor%

was ergibt:

%Vor%

Ich nehme auf Basis von PromiseRejectionHandledWarning an, dass die Behandlung einer Promise Ablehnung asynchron eine schlechte Sache ist / sein könnte.

Aber warum ist das?

    
rabbitco 01.12.2016, 20:53
quelle

2 Antworten

15

"Sollte ich die asynchrone Verarbeitung der Promise-Zurückweisung vermeiden?"

Diese Warnungen dienen einem wichtigen Zweck, aber um zu sehen, wie alles funktioniert, sehen Sie diese Beispiele:

Versuchen Sie Folgendes:

%Vor%

Oder das:

%Vor%

Oder das:

%Vor%

Disclaimer: Ich bin der Autor des abgefangenen Moduls (und ja, ich habe es für diese Antwort geschrieben).

Begründung

wurde dem Knoten als eines der Bricht die Änderungen zwischen v6 und v7 ab . Es gab eine hitzige Diskussion darüber in Ausgabe Nr. 830: Verhalten bei der standardmäßigen unbehandelten Ablehnungserkennung , ohne dass eine allgemeine Vereinbarung darüber getroffen wurde, wie Versprechen abgegeben werden Bei asynchron angebrachten Ablehnungshandlern sollte sich verhalten - ohne Warnungen arbeiten, mit Warnungen arbeiten oder durch Beenden des Programms überhaupt verboten sein. Weitere Diskussionen fanden in mehreren Ausgaben des unbehandelten-Zurückweisungs-Spezifikations Projekts statt.

Diese Warnung soll Ihnen helfen, Situationen zu finden, in denen Sie vergessen haben, mit der Ablehnung umzugehen, aber manchmal möchten Sie dies möglicherweise vermeiden. Zum Beispiel möchten Sie möglicherweise eine Reihe von Anfragen machen und die resultierenden Versprechen in einem Array speichern, nur um es später in einem anderen Teil Ihres Programms zu behandeln.

Einer der Vorteile von Versprechen gegenüber Rückrufen ist, dass Sie den Ort, an dem Sie das Versprechen erstellen, von dem Ort (oder den Orten) trennen können, an dem Sie die Handler anhängen. Diese Warnungen machen es schwieriger, aber Sie können entweder die Ereignisse behandeln (mein erstes Beispiel) oder einen Dummy-Catch-Handler anhängen, wenn Sie ein Versprechen erstellen, das Sie nicht sofort behandeln möchten (zweites Beispiel). Oder Sie können ein Modul für Sie tun (drittes Beispiel).

Warnungen vermeiden

Das Hinzufügen eines leeren Handlers ändert nichts an der Art, wie das gespeicherte Versprechen in irgendeiner Weise funktioniert, wenn Sie es in zwei Schritten tun:

%Vor%

Dies wird jedoch nicht dasselbe sein:

%Vor%

Hier ist prm2 ein anderes Versprechen als prm1 . Während prm1 mit dem Fehler 'fail' abgelehnt wird, wird prm2 mit undefined aufgelöst, was wahrscheinlich nicht das ist, was Sie wollen.

Aber Sie könnten eine einfache Funktion schreiben, damit es wie ein zweistufiges Beispiel oben funktioniert, wie ich es mit dem Modul caught gemacht habe:

%Vor%

Hier ist prm3 identisch mit prm1 .

Siehe: Ссылка

2017 Aktualisierung

Siehe auch Pull-Anforderung Nr. 6375: lib, src: "Wirf" auf nicht behandelte Versprechensverweigerungen (nicht zusammengeführt) (Stand: February 2017), das als Milestone 8.0.0 gekennzeichnet ist:

  

Macht Versprechen "wirft" Ablehnungen, die wie reguläre nicht erfasste Fehler verlassen. [Hervorhebung hinzugefügt]

Dies bedeutet, dass wir erwarten können, dass Knoten 8.x die Warnung, in der sich diese Frage befindet, in einen Fehler ändert, der abstürzt und den Prozess beendet, und wir sollten dies beim Schreiben unserer Programme heute berücksichtigen um Überraschungen in der Zukunft zu vermeiden.

Siehe auch Node.js 8.0.0 Tracking-Problem Nr. 10117 .

    
rsp 01.12.2016, 22:23
quelle
1
  

Ich nehme an, dass die asynchrone Verarbeitung einer Promise-Zurückweisung eine schlechte Sache ist.

Ja, tatsächlich.

Es wird erwartet, dass Sie wollen sofort alle Ablehnungen behandeln. Wenn Sie dies nicht tun (und möglicherweise nie damit umgehen), erhalten Sie eine Warnung.
Ich habe kaum Situationen erlebt, in denen du nicht sofort versagen würdest, nachdem du eine Ablehnung bekommen hast. Und selbst wenn Sie nach dem Fehler noch etwas warten müssen, sollten Sie das explizit tun.

Ich habe noch nie einen Fall gesehen, bei dem es unmöglich wäre, den Fehlerhandler sofort zu installieren (versuchen Sie, mich anders zu überzeugen). In Ihrem Fall, wenn Sie eine leicht verzögerte Fehlermeldung möchten, tun Sie einfach

%Vor%     
Bergi 01.12.2016 23:51
quelle

Tags und Links