javascript promise q

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.