javascript - ¿Hay alguna manera de regresar temprano en promesa diferida?
promise q (2)
Así que tengo una promesa que contiene múltiples controles como este
function test(){
var deferred = q.defer()
var passed = false
if(!passed){
deferred.reject("Don''t proceed")
//return
} else {
if(!passed){
deferred.reject("Don''t proceed")
} else {
if(!passed){
deferred.reject("Don''t proceed")
} else {
setTimeout(function(){
console.log("Hello");
deferred.resolve()
}, 100);
}
}
}
return deferred.promise
}
Esto se ve mal porque hay una pirámide en la parte inferior. Me pregunto si hay algo como regresar en ''q'' que puede hacer que el código se vea mejor. Por ejemplo así:
function test(){
var deferred = q.defer()
var passed = false
if(!passed){
deferred.reject("Don''t proceed")
return
}
if(!passed){
deferred.reject("Don''t proceed")
return
}
if(!passed){
deferred.reject("Don''t proceed")
return
}
setTimeout(function(){
console.log("Hello");
deferred.resolve()
}, 100);
return deferred.promise
}
Esto definitivamente no funciona porque regresó antes de que se devuelva la promesa, pero me pregunto si hay algo así como una devolución.
Intente no crear un solo diferido, que podría ser rechazado de múltiples partes de su función, y que necesitaría devolver en cada punto de salida.
En su lugar, codifique con promesas separadas, una para cada rama de flujo de control que tenga.
Puede usar
Q.reject
y el
constructor
Q.Promise
: evite el patrón diferido en desuso.
Su función se vería así:
function test() {
var deferred = q.defer()
var passed = false
if (!passed)
return Q.reject("Don''t proceed");
if (!passed)
return Q.reject("Don''t proceed");
if (!passed)
return Q.reject("Don''t proceed");
// else
return new Promise(function(resolve) {
setTimeout(function(){
console.log("Hello");
resolve();
}, 100);
});
}
Alternativamente, puede ajustar su función de
test
en
Q.fbind
, para que en lugar de escribir
return Q.reject(…);
podrías simplemente
throw …;
.
function test(){
var deferred = q.defer()
var passed = false
if(true){
deferred.reject(new Error("Don''t proceed1"))
return deferred.promise
}
if(!passed){
deferred.reject(new Error("Don''t proceed2"))
return deferred.promise
}
if(!passed){
deferred.reject(new Error("Don''t proceed3"))
return deferred.promise
}
setTimeout(function(){
console.log("Hello");
deferred.resolve()
});
return deferred.promise
}
Creo que esta es la mejor manera, gracias a Bergi.