我编写了一个Node包来执行一些密集的数据处理。我可以通过console.log
观看进度,但我想为最终用户提供一种以事件驱动方式监控它的方法。基本上,它就像返回一个承诺,除了一个then
事件,它将为每个“步骤”生成一个事件,然后最终解决数据。
不幸的是,我不太了解节点流(我猜这是我需要的东西)来做到这一点。我能指点一下吗?我怎样才能创建一个流,每当有更多的进度增加1%时会更新,然后最终给出计算数据?
编辑:举个例子,考虑这个循环:
for(let i = 0; i < N; i++) {
intensiveFunction();
console.log(`${i} of ${N} completed`);
}
我想做的是
for(let i = 0; i < N; i++) {
intensiveFunction();
// send user a signal that i/N of the task has been completed
}
答案 0 :(得分:2)
您不需要使用流,您可以使用EventEmitter,并发出当前进度或您可能想要的任何事件。
我-package.js 强>
const EventEmitter = require('events');
// Create a class that extends from EventEmitter
// And now you can emit events when something happens, e.g., progress update
class MyPackage extends EventEmitter {
async intensiveFunction() {
// Something
}
async process() {
for(let i = 0; i < N; i++) {
await this.intensiveFunction();
this.emit('step', i, N); // Or send progress in % or whatever you want
}
}
}
module.exports = MyPackage;
<强> index.js 强>
const MyPackage = require('my-package');
const package = new MyPackage();
package.on('step', (step, total) => console.log(`${step}/${total}`));
package.process();
您可以提供完整事件API,也可以将其与promises混合使用。含义process
可以解决一次,或者您可以发出end
事件,或同时执行这两项操作。
async process() {
for(let i = 0; i < N; i++) {
await this.intensiveFunction();
this.emit('step', i, N); // Or send progress in % or whatever you want
}
// Emit the end event
this.emit('end', result);
// And resolve the promise
return result; // Whatever result is
}