Frage

Sind die folgenden Codeausschnitte gleichwertig?

Version 1

function doSomething() {
  var defer = $q.defer();

  foo().then(function() {
    bar().then(function() {
      defer.resolve();
    });
  });

  return defer.promise;
}

Version 2

function doSomething() {
  return foo().then(bar);
}
War es hilfreich?

Lösung

Es gibt viele Unterschiede zwischen diesen beiden Ansätzen.

Der Hauptunterschied zwischen den beiden Snippets besteht darin version 2 Sie übergeben implizit den aufgelösten Wert von foo direkt zu bar.Darüber hinaus doSomething wird alles lösen bar wird sich auflösen, während in version 1 das Ergebnis wird verworfen.

Einige weitere wichtige Punkte von Benjamin Grünbaum:

(a) Wenn Balken ein Referenzfehler ist, lehnt 1 das innere Versprechen und 2 Würfe ab.
(b) 1 erfordert einen Verweis auf $ Q, wobei 2 die Implementierung agnostisch ist.
(C) Version 1 ist nicht ausnahmesicher und eine Ablehnung wird geschluckt, bei der Version 2 Sie eine Ablehnung stellen lassen.;Es gibt auch mehrere kleinere Unterschiede.Siehe stackoverflow.com/questions/22539815

Man könnte es auch so schreiben.
Auf diese Weise erhalten Sie nicht die implizite Weitergabe des aufgelösten Werts von foo Zu bar (es ist jetzt explizit), was verwirrend sein oder leicht übersehen werden kann.Es kann auch nützlich sein, wenn Sie etwas mit den aufgelösten Werten von tun möchten foo oder bar bevor Sie sie zurückgeben.

function doSomething() {
  return foo().then(function(res){
     // maybe  do something with the result of foo
     return bar(res);
  }).then(function(res){
     // maybe do something with the result of bar
     return res;
  });
}

Das manuelle Erstellen eines zurückgestellten Objekts sollte auf ein Minimum beschränkt werden und ist im Allgemeinen ein Anti-Pattern.

https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern

Das hier demonstrierte Schlüsselprinzip besteht darin, dass ein Versprechen den Status des zurückgegebenen Versprechens (oder thenable ) innerhalb seiner Auflösungsmethode annimmt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top