La simplificación de las promesas en Javascript
-
21-12-2019 - |
Pregunta
Son los siguientes fragmentos de código equivalente?
Versión 1
function doSomething() {
var defer = $q.defer();
foo().then(function() {
bar().then(function() {
defer.resolve();
});
});
return defer.promise;
}
La versión 2
function doSomething() {
return foo().then(bar);
}
Solución
Hay muchas diferencias entre estos dos enfoques.
La principal diferencia entre los dos fragmentos es que en version 2
su implícitamente se pasa el valor resuelto de foo
directamente a bar
.Además de que doSomething
va a resolver lo que sea bar
va a resolver, mientras que en version 1
el resultado se descarta.
Algunos otros puntos importantes realizados por Benjamín Gruenbaum:
(a) si la barra es un error de referencia 1 rechaza el interior de la promesa y 2 a los tiros.
(b) 1 requiere una referencia a $q, donde 2 es la aplicación agnóstico.
(c) la versión 1 no es una excepción segura y un rechazo será tragó donde la versión 2 se permiten .coger un rechazo.;Hay varias pequeñas diferencias.Ver stackoverflow.com/preguntas/22539815
También podríamos escribir algo como esto.
De esta manera usted no recibe el implícita pasar a través de la resueltas valor de foo
a bar
( explicito ahora ), que puede ser confuso o fácilmente pasado por alto.También puede ser útil si quieres hacer algo con el resuelto valores de foo
o bar
antes de regresar a ellos.
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;
});
}
Creación manual de un diferidos objeto debe mantenerse a un mínimo y generalmente es un anti patrón.
https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern
El principio clave que se demuestra aquí es que una promesa de que va a adoptar el estado de devolución de la promesa ( o thenable ) dentro del método resolve.