Estoy usando the Q module para Node.js en un intento de evitar la "pirámide de fatalidad" en escenarios en los que tengo muchos pasos. Por ejemplo:Cómo abortar correctamente una cadena de promesa node.js usando Q?
function doTask(task, callback)
{
Q.ncall(task.step1, task)
.then(function(result1){
return Q.ncall(task.step2, task);
})
.then(function(result2){
return Q.ncall(task.step3, task);
})
.fail(callback).end();
}
Esencialmente esto parece funcionar; si se produce un error en alguno de los pasos de la tarea, se pasa a la devolución de llamada (aunque sería bienvenido a las mejoras, ya que soy nuevo en las promesas de node.js). Sin embargo, tengo un problema cuando necesito abortar la cadena de tareas temprano. Por ejemplo, si se devuelve con éxito resultado1 puede ser que quiera llamar a la devolución de llamada temprana y abortar el resto, pero mis intentos de hacerlo no se ...
function doTask(task, callback)
{
Q.ncall(task.step1, task)
.then(function(result1){
if(result1)
{// the rest of the task chain is unnecessary
console.log('aborting!');
callback(null, result1);
return null;
}
return Q.ncall(task.step2, task);
})
.then(function(result2){
console.log('doing step 3...');
return Q.ncall(task.step3, task);
})
.fail(callback).end();
}
En este ejemplo, veo tanto "abortar" y "haciendo el paso 3 ..." impreso.
Estoy seguro de que estoy simplemente malinterpretando algunos principios básicos aquí, por lo que agradecería cualquier ayuda. ¡Gracias!
Una solución que encontré es crear una cadena promesa separada después de la primera cadena se puede romper. De lo que se trata, en el ejemplo anterior, la instrucción .then con result2 se adjunta a Q.ncall para el paso 2, en lugar de adjuntarse a la promesa original. SIN EMBARGO, la desventaja principal aquí es que se deshace de uno de los principales beneficios de Q en mi opinión: ¡evitar la pirámide de la fatalidad! Todavía es mejor que no tener ninguna promesa, pero no me gusta la solución ... –