Обеспечить прогресс в обработке данных - PullRequest
0 голосов
/ 04 июня 2018

Я написал пакет 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
}

1 Ответ

0 голосов
/ 04 июня 2018

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

my-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 событий или смешать его с обещаниями.Значение 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...