¿Hay alguna manera de regresar temprano en la promesa diferida?

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 return in ‘q’ que pueda 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 rechazarse de varias partes de su función y que debería devolver en cada punto de salida.
En cambio, codifique con promesas separadas, una para cada 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 , de modo 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