marcpaes of TG4 - Infra
5/10/2018 - 3:11 PM

Array Async Queue

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!!!");
});