Semplificare le promesse in JavaScript
-
21-12-2019 - |
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);
}
. 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.
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.