2015-08-24 2 views
1

Во время инициализации моего приложения Sails.js мне нужно выполнить несколько задач, зависящих от другого. Если какая-либо из этих задач возвращает ошибку, вся цепочка должна выйти из строя и отменить sails lift.Цепочки асинхронных функций в node.js w/sails.js

псевдокод:.

configureApis() 
    .then(getServiceStatus) 
    .then(setRegionJobs) 
    .then(cb) 
    .catch(cb) 

Проблема, каждая из этих функций возвращают Promises (за исключением cb, которая является функцией обратного вызова in this question

Как я могу добиться этого бы async.waterfall любого использования здесь? ?

+0

Асинхронный водопад звучит так, как будто он подходит к законопроекту, но, возможно, обещания усложняют его. Вы можете попробовать [обещать водопад] (https://github.com/dotSlashLu/promise-waterfall) – forgetso

+0

Чтобы уточнить, «Promise-waterfall расширяет возможности обещаний с последовательным управлением потоком, например ** async.waterfall **». – forgetso

+0

Возможно, вам не следует использовать один и тот же обратный вызов для 'then' и' catch' в вашей цепочке обещаний, потому что в обеих ситуациях он получит разные типы аргументов, результат по предыдущему обещанию или объект ошибки во втором случае. –

ответ

0

Любые функции могут стать Promise, если вы заверните его в конструктор Promise. Это как:

... 
.then(function(){ return somePromise(); }) 
.then(function(){ 

    return Promise(function(resolve, reject){ 
    /* do whatever your function here, and call either resolve or reject 
    * resolve usually for `positive` or true result 
    * reject usually for `negative` or false result, and it's usually an Error object 
    */ 

    someFunction('param1', callback function(err, result){ 
     if (err) return reject(err); 
     return resolve(result); 
    }); 

    }); 

}) 
.then(function(result){ 
    /* result from previous Promise can be use here */ 
}) 
.catch(function(err){ 
    /* catch error from any of promises above */ 
    console.error(err); 
}); 
Смежные вопросы