Javascript 如何显示终端中完成的百分比

Javascript 如何显示终端中完成的百分比,javascript,node.js,command-line-interface,imperative,Javascript,Node.js,Command Line Interface,Imperative,大家好 今天,我正在使用这个复杂的脚本,它向具有服务器端呈现的站点发出请求,获取HTML,中断并获取一些数据。该脚本有4个阶段:phaseOne、phaseTwo、PhaseTree和phaseFour 哪些阶段具有类似的接口: class PhaseOne { constructor(MAP) { this.MAP = MAP || MAP; } // All code related with the phase here. process() {} } 所以我在

大家好

今天,我正在使用这个复杂的脚本,它向具有服务器端呈现的站点发出请求,获取HTML,中断并获取一些数据。该脚本有4个阶段:phaseOne、phaseTwo、PhaseTree和phaseFour

哪些阶段具有类似的接口:

class PhaseOne {
  constructor(MAP) {
    this.MAP = MAP || MAP;
  }

  // All code related with the phase here.
  process() {}
}
所以我在所有阶段处理这个MAP对象,并调用堆栈中的每个阶段,如下所示:

let phases = require('./phases');

[
  // 'Initial',
  'PhaseOne',
  'PhaseTwo',
  'PhaseThree',
  'PhaseFour',
].reduce((m, fn) => {
  return new phases[fn](m).process();
}, MAP);
let phases = require('./phases');

//set up
let progressMonitor =  new require('events')
progressMonitor.on('progress', percentDone => {
  console.log(percentDone + '% done')
})

// your existing code
[
  // 'Initial',
  'PhaseOne',
  'PhaseTwo',
  'PhaseThree',
  'PhaseFour',
].reduce((m, fn) => {
  return new phases[fn](m).process(progressMonitor);
}, MAP);
一切正常。我的问题是:有些阶段真的很慢。。所有的程序都需要30分钟才能完成。。我想在我的终端中看到每个阶段的百分比

比如:

但是我没有任何想法,我也找不到一个好的教程来做这件事

当前在我的进程函数中,我有for循环,if语句。。一般来说,我使用命令式风格

PhaseOne的一个示例:

   // In this phase we need the property string in MAP.aguia01 to
    // assign the first context and extract the data with regex.
    if (typeof this.MAP.aguia01.string === 'undefined') {
      cli.fatal(
        'MAP doesn\'t have the necessary properties to run in Aguia01 phase. Exiting...'
      );
    }

    for (let month of months) {
      this.MAP.aguia01.string += requests.aguia01.apply(this, [month]);
    }

    for (let info of patterns.aguia01.infos) {
      this.MAP.aguia01.infos[info.name] = (
        this.MAP.aguia01.string.match(info.pattern)
      )[1];
    }

    for (let line of patterns.aguia01.lines) {
      this.MAP.aguia01.lines[line.name] = (
        this.MAP.aguia01.string.match(line.pattern)
      )[1];
    }
所以。。有可能用命令式风格做我想做的事吗

谢谢。

有软件包,但如何定义“进度”取决于您自己。您定义了一个与完成状态相对应的记号数,然后,您只需调用进度条上的一个方法,使其成为“进度”。例如:

var ProgressBar = require('progress');

// 10 ticks to complete the task
var bar = new ProgressBar(':bar', { total: 10 });
var timer = setInterval(function () {
  // make the bar tick(), each call will make a 10% progress
  bar.tick();
  if (bar.complete) {
    console.log('\ncomplete\n');
    clearInterval(timer);
  }
}, 100);

在reduce调用之外保留一个上下文对象来进行处理怎么样?您可以将其设置为事件发射器,然后将其传递给流程函数。在流程函数中,您可以发出进度事件,然后可以记录这些事件。也许是这样的:

let phases = require('./phases');

[
  // 'Initial',
  'PhaseOne',
  'PhaseTwo',
  'PhaseThree',
  'PhaseFour',
].reduce((m, fn) => {
  return new phases[fn](m).process();
}, MAP);
let phases = require('./phases');

//set up
let progressMonitor =  new require('events')
progressMonitor.on('progress', percentDone => {
  console.log(percentDone + '% done')
})

// your existing code
[
  // 'Initial',
  'PhaseOne',
  'PhaseTwo',
  'PhaseThree',
  'PhaseFour',
].reduce((m, fn) => {
  return new phases[fn](m).process(progressMonitor);
}, MAP);
然后在流程函数中:

class PhaseOne {
 constructor(MAP) {
    this.MAP = MAP || MAP;
  }

  // All code related with the phase here.
  process(progressMonitor) {
    //do work
    progressMonitor.emit('progress', 10)
    //more work
    progressMonitor.emit('progress', 15)
    //much work
    progressMonitor.emit('progress', 75)
  }
}

使用setInterval不会使代码异步@ShanShan?@MrBear它是异步的,它表明
progress
可以在异步环境中正常工作。