Обработка нескольких обещаний с помощью нескольких шагов - PullRequest
0 голосов
/ 07 марта 2019

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

Например:

function multiplyAndSum(a1, a2){
  ret = 0;
  for(var i = 0, l = a1.length; i < l; i++){
    ret += a1[i]*a2[i];
  }
  return ret;
}

function getProcessedData(){
  var worker1 = new Worker('recordProcessor.js');
  var worker2 = new Worker('recordprocessor.js');
  var results = null;
  worker1.onmessage(event=>{
    results=(!results)?event.results:
      multiplyAndSum(event.results, results);
  });
  worker2.onmessage(event=>{
    results=(!results)?event.results:
      multiplyAndSum(event.results, results);
  });
  var ds1 = fetch('./dataSet1.json')
    .then(rep=>resp.json())
    .then(d=>worker1.postMessage({
      'set': 1,
      'data': d
    }));
  var ds2 = fetch('./dataSet2.json')
    .then(rep=>resp.json())
    .then(d=>worker2.postMessage({
      'set': 1,
      'data': d
    }));
  // Once results is populated return results
}

Я думаю, мне нужно обернуть все это в другое обещание, но я не совсем уверен, каксделать это.

1 Ответ

2 голосов
/ 07 марта 2019

Ну, вот другой способ приблизиться к нему:

function multiplyAndSum(a1, a2){
  let ret = 0;
  for(let i = 0, l = a1.length; i < l; i++){
    ret += a1[i]*a2[i];
  }
  return ret;
}

function getWorkerMessage(worker) {
    return new Promise((resolve, reject) => {
        worker.onmessage(event => {
            resolve(event);
        });
    });
}

function getProcessedData(){
    const worker1 = new Worker('recordProcessor.js');
    const worker2 = new Worker('recordprocessor.js');

    let p = Promise.all([
        getWorkerMessage(worker1),
        getWorkerMessage(worker2)
    ]).then([a1, a2] => {
        return multiplyAndSum(a1.results, a2.results);
    });

    // start off both workers by sending them their data
    fetch('./dataSet1.json')
      .then(rep=>resp.json())
      .then(d=>worker1.postMessage({'set': 1,'data': d}));
    fetch('./dataSet2.json')
      .then(rep=>resp.json())
      .then(d=>worker2.postMessage({'set': 1,'data': d}));

    return p;
}

// usage
getProcessedData().then(result => {
    console.log(result);
}).catch(err => {
    console.log(err);
});

Вот мое понимание того, что вы пытаетесь сделать.

  1. Создайте двух рабочих
  2. Извлечение двух наборов данных и передача одного набора данных каждому работнику
  3. Когда у вас есть обработанные данные от обоих работников, умножьте два полученных массива вместе и суммируйте продукты, чтобы создать одно конечное значение
  4. Затем вызывающий объект хочет получить это окончательное значение

Итак, мой предложенный код использует превращает рабочее сообщение в операцию, которая возвращает обещание, которое разрешается в результате этой работы, когда она выполнена.Затем я использую Promise.all(), чтобы узнать, когда оба работника закончили.В этот момент у вас есть два массива данных, которые можно умножить и суммировать для получения окончательного результата.

Потенциально свободный конец: нужно ли вычистить двух рабочих, когда закончите с ними?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...