Exemplo de como encadear uma tarefa assíncrona em cima de um array, em ordem, de modo que elas não executem todas ao mesmo tempo e se tenha controle do término.
'use strict';
var q = require('q');
//Dummy promise
var dummyAsyncTask = function(action) {
var deferred = q.defer();
setTimeout(function(){
console.log(action + "....");
deferred.resolve();
}, 1000);
return deferred.promise;
};
//Receives an array and current index
var saveActionsQueue = function(actions, idx) {
idx = idx || 0;
var deferred = q.defer();
dummyAsyncTask(actions[idx]).then(function(){
if (idx < actions.length - 1) {
saveActionsQueue(actions, ++idx).then(function(){
deferred.resolve();
}).catch(function(err) {
deferred.reject(err);
});
}
else {
deferred.resolve();
}
}).catch(function(err) {
deferred.reject(err);
});
return deferred.promise;
}
//Action call
saveActionsQueue([1,2,3,4,5]).then(function() {
console.log("acabou!!!");
}).catch(function(err) {
console.log("Erro!!!");
});