通过async.series - nodeJs传递进度条

时间:2016-01-30 22:51:51

标签: javascript node.js asynchronous progress

正确的尝试从通过异步系列运行的任务列表中获得进展

/sys/device/system/cpu/cpufreq/ondemand

这是我的代码的一个非常简单的版本。

问题

如何将条形图传递给每个函数或“通过”函数和回调到每个可以使用的任务成功的回调

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();
}

我尝试的一切我得到的栏没有定义所以尝试通过回调函数(回调,栏)将栏传递给函数然后我得到勾选未定义

我是nodeJs和well js的新手,所以请保持温和

注意我想要实现的是完成在进度条中显示当前任务的功能列表 我已经阅读了文档,并查看了进展和异步的示例,但仍然可以做出正面或反面

我是关闭还是有更好的方法

3 个答案:

答案 0 :(得分:0)

每次要更新任务栏中的当前任务时,都应添加bar.tick。例如:

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

所有函数(task1,task2)都应在update函数的INSIDE中声明,否则它们将无法访问bar变量。

答案 1 :(得分:0)

我不确定它是最好的解决方案,但是在进行回调和请求结果时,我有一些计数器,然后我会在我的" final"回调:

即。有一个全局的(在函数更新()之前)

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

然后在每个任务函数集中

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

然后,您可以检查完成任务的全局变量并采取相应的行动。

编辑:示例回调可能是:

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

   // update progress

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

答案 2 :(得分: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)
}