2016-01-30 2 views
1

Правильных им пытается получить прогресс из списка задач пробежать асинхронную сериюPass прогресс бар через async.series - nodeJs

module.exports = update; 

function update(){ 
    // Require Deps 
    var async = require('async'); 
    var progress = require('progress); 
    var tasks = [task1,task2,task3]; 

    // Create the progress bar using the list of tasks 
    // as the length of the bar 
    var bar = new progress(':current/:total [:bar] :task', { 
    total: tasks.length 
    }); 

    //Run async series using the array of tasks 
    async.series(tasks,function(err,result){ 
    // Do something with the results or errors 
    }) 
}; 

var task1 = function(callback){ 
    callback(); 
}; 

var task2 = function(callback){ 
    callback(); 
} 

Это очень простой вариант моего кода.

Вопрос

Как я могу передать строку для каждой из функций или «через» функции и обратные вызовы в том, что на успех каждой задачи им возможность использовать

bar.tick({'task': tasks[bar.curr]}); 

все Я стараюсь, чтобы бана не определялась, поэтому попробовал пропустить барабан в функции с функцией обратного вызова (обратный вызов, бар), а затем я не ставил галочку

Im new to nodeJs и well js все вместе так, пожалуйста, ge ntle

ПРИМЕЧАНИЕ, что им пытаются достичь является для завершения списка функций, отображающих текущую задачу в строке прогресса Ive читать документы и посмотрел на примеры для прогресса и асинхронной, но все еще может; т сделать головы или хвосты него

Am Я закрываю или есть лучший способ

+0

Вы задали вопрос, почему бы вам не ответить или не принять никакого ответа? – Aminadav

ответ

0

вы должны добавить bar.tick, каждый раз, когда вы хотите обновить текущую задачу в панели задач. Например:

var task1 = function(callback){ 
    bar.tick({bar:'Finish First Task'}) 
    callback(); 
}; 

Все ваши функции (task1, task2) должны быть объявлены ВНУТРИ из update функции, в противном случае они не смогут получить доступ к переменной bar.

+0

Я знаю, что мне понадобится bar.tick, чтобы продвинуть планку, не довольный тем, что у меня есть все функции внутри функции обновления, хотя, поскольку я в конечном итоге хочу сгенерировать список функций динамически, добавив их все с помощью одной общей задачи имени .task1 задач.task2 на превращении объекта задач в массив для запуска, но я хотел, чтобы внешние функции, чтобы новые задачи могли быть добавлены, и список задач asyncs будет автоматически обновлен. –

+0

Могу ли я не просто использовать переменную bar как глобальную, чтобы ее можно было оценить внешними функциями? –

0

Я не уверен, что его лучшее решение, но при выполнении имеющих обратных вызовов и запрашивают результат, у меня есть какое-то счетчик, который я тогда проверить в моем «окончательном» обратный вызов:

т.е. имеет глобальное (до обновление функции())

var tasksStatus = {task1:false,task2:false,task3:false}; 

, а затем в каждой функции задачи установлено, что

var task1 = function(callback){ 
    tasksStatus.task1 = true; 
    callback(); 
}; 

затем вы можете проверить глобальную переменную, для которой делается задача и действовать переменного тока cordingly.

Edit: пример обратного вызова может быть:

callback = function() { 
    var status = 0; 
    for(var s in tasksStatus) { 
    if(tasksStatus[s]) 
     status += 33; 
    } 

    // update progress 

    if(status == 99) { 
    // done.... 
    } 
} 
+0

Если бы мне потребовалось другое задание, чтобы наблюдать за массивом (taskStatus) для изменений, а одно из событий - одно из изменений значения, то bar.tick() или process.tick() –

+0

функция обратного вызова может проверять состояние задачи (см. – Niko

0

Это немного сложнее, мне очень жаль. Мы делаем новую функцию вместо функций в массиве. Новая функция, которую мы называем исходной функцией, и когда исходная функция заканчивается (обратный вызов), она вызовет progress.tick, после чего она запустит функцию обратного вызова.

var tasks=[task1,task2,task3] 

for (var i in tasks){ 
    (function(orgFunc,i){ // This Function will be run on task1,task2,task3. `i` will be 0,1,2, `orgFunc` will be the original function. 
    tasks[i]=function(next){ // Replace the original function with new function 
     orgFunc(funtion(){ // Call the original function 
      bar.tick({bar:'Finish Task #' + i})     
      next.apply(null,arguments) // Call the callback. 
     }) 
    }}).bind(null,tasks[i],i) 
}