Как использовать асинхронный код JavaScript с веб-работниками в классе - PullRequest
0 голосов
/ 14 февраля 2019

Я написал класс javascript, который при создании создает веб-работника.Другой метод в этом классе запускает рабочий.Я хочу вызвать метод запуска работника, а затем сделать что-то впоследствии асинхронно.Для лучшего понимания я добавил скелет кода схемы ниже.

Я пытался сгенерировать и сохранить Promise в переменной класса, а затем действовать в соответствии с ним, но это был неправильный анзац.Ссылка на JS Bin .

class Task{
  constructor(){
    this.data = 0;
    //this.listen; //my idea, does not work
    this.worker = new Worker('worker.js');

    this.worker.onmessage = (function(e){
      // worker constantly emits messages
      let data = e.data.split(' ');
      // suppose message is now availabe as array
      this.data = data;

      if(data.includes("trigger")){
        //trigger signals that the heavy computation is over

        /* my idea didn't work:
        *this.listen = Promise.resolve(1);
        */
      }
    }).bind(this);
  }

  async doTask(){
    this.worker.postMessage("start computation");
    //wait for the worker to finish calculation
    /*my idea
    *await this.listen;
    */

    //do something after trigger was sent
    return 0;
  }
}

1 Ответ

0 голосов
/ 14 февраля 2019

возможно что-то вроде этого?

class Task{
  constructor(){
    this.data = 0;
    this.worker = new Worker('worker.js');
  }
  async calculation() {
    if (this.worker.onmessage === null) {
      return new Promise(resolve => {
        this.worker.onmessage = e => {
          let data = e.data.split(' ');
          // suppose message is now availabe as array
          this.data = data;

          if(data.includes("trigger")){
            this.worker.onmessage = null;
            resolve();
          }
        };
        this.worker.postMessage("start computation");
      });
    } else {
      console.log('One calc at a time please...');
    }
  }
  async doTask(){
    await this.calculation();

    //do something after trigger was sent
    return 0;
  }
}
...