【问题标题】:Pass progress bar through async.series - nodeJs通过 async.series 传递进度条 - nodeJs
【发布时间】:2016-01-30 22:51:50
【问题描述】:

我正在尝试从通过异步系列运行的任务列表中获取进度

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

我尝试的一切都没有定义 bar,所以尝试使用回调函数(callback,bar)将 bar 传递给函数,然后我得到未定义的刻度

我是 nodeJs 和 js 的新手,所以请温柔

注意 我试图实现的是完成一个在进度条中显示当前任务的功能列表 我已经阅读了文档并查看了有关进度和异步的示例,但仍然无法确定它的正面或反面

我是接近还是有更好的方法

【问题讨论】:

  • 你问了一个问题,为什么不投票或接受任何答案?

标签: javascript node.js asynchronous progress


【解决方案1】:

你应该添加bar.tick,每次你想在任务栏中更新当前任务。例如:

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

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

【讨论】:

  • 我知道我需要 bar.tick 来推动进度条,但我不喜欢将所有函数都包含在更新函数中,但最终我想动态生成函数列表,所以追加它们都具有一个通用名称 tasks.task1 tasks.task2 将任务对象转换为要运行的数组,但我希望这些函数是外部的,以便可以添加新任务并自动更新异步任务列表
  • 我可以不只将 bar 变量用作全局变量,以便外部函数对其进行评估吗??
【解决方案2】:

有点复杂,对不起。我们所做的是创建新函数而不是数组中的函数。新函数我们调用原函数,当原函数完成(回调)后,它会调用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)
}

【讨论】:

    【解决方案3】:

    我不确定它是最好的解决方案,但是在进行回调并请求结果时,我有某种计数器,然后我会检查我的“最终”回调:

    即有一个全局(在函数 update() 之前)

    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....
       }
    }
    

    【讨论】:

    • 然后我是否需要另一个任务来观察数组 (taskStatus) 的更改,并且其中一个值更改的事件执行 bar.tick() 或 process.tick()
    • 回调函数可以检查任务状态(见编辑)
    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多