Domanda

sono i seguenti frammenti di codice equivalenti?

Versione 1

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

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

  return defer.promise;
}
.

Versione 2

function doSomething() {
  return foo().then(bar);
}
.
È stato utile?

Soluzione

Ci sono molte differenze tra questi due approcci.

La principale differenza tra i due frammenti è che in version 2, passando implicitamente il valore risolto da foo direttamente a bar. Oltre a quel doSomething risolverà qualsiasi generacolodicetagcode si risolverà, mentre in bar il risultato viene scartato.

Alcuni ulteriori punti importanti realizzati da Benjamin Gruenbaum:

.

(a) Se la barra è un errore di riferimento 1 rifiuta la promessa interna e 2 Gruppi.
. (b) 1 richiede un riferimento a $ Q dove 2 è l'implementazione agnostico.
. (c) la versione 1 non è un'eccezione sicura e un rifiuto sarà Ingoiato dove la versione 2 ti lascerà .Catch un rifiuto. ; Ci sono anche diverse differenze più piccole. Vedere stackoverflow.com/questions/22539815

Potresti anche scriverlo come questo.
In questo modo non si ottiene il passaggio del passaggio implicito del valore risolto da version 1 a foo (è esplicito ora), che può essere confuso o facilmente trascurato. Può anche essere utile se si desidera fare qualcosa con i valori risolti di bar o foo prima di restituirli.

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;
  });
}
.

La creazione manuale di un oggetto differita deve essere mantenuta al minimo ed è generalmente un anti schema.

https://github.com/ Petkaantonov / Bluebird / Wiki / Promise-Anti-modelli # The-Deferred-Anti-Pattern

Il principio chiave che viene dimostrato qui è che una promessa adotterà lo stato della promessa restituita (o del Mantevole) all'interno del suo metodo di risoluzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top