Ожидание на нескольких методах карты, чтобы вернуться, используя обещания, а затем получить все карты, возвращающие значения - PullRequest
0 голосов
/ 21 октября 2018

В экспресс-проекте у меня есть 2 карты, которые проходят через экземпляр кукловода и оба возвращают массивы.В настоящее время я использую Promise.all, чтобы дождаться окончания обеих карт, но он возвращает только значения из первого массива, а не второго.Как я могу сделать это, чтобы получить результаты обеих переменных карты?

const games = JSON.parse(JSON.stringify(req.body.games));

const queue = new PQueue({
  concurrency: 2
});

const f = games.map((g) => queue.add(async () => firstSearch(g.game, g.categories)));
const s = games.map((g) => queue.add(async () => secondSearch(g.game, g.categories)));

return Promise.all(f, s)
  .then(function(g) {
    console.log(g); //only returns `f` result, not the `s`
  });

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Нет необходимости использовать PQueue, bluebird уже поддерживает это "из коробки":

(async () => {
  const games = JSON.parse(JSON.stringify(req.body.games));
  let params = { concurrency: 2};
  let r1 = await Promise.map(games, g => firstSearch(g.game, g.categories), params);
  let r2 = await Promise.map(games, g => secondSearch(g.game, g.categories), params);
  console.log(r1, r2);
 })();

Или более правильно, но с большим количеством кода (поэтому последний - первый поиск не ждет):

(async () => {
  const games = JSON.parse(JSON.stringify(req.body.games));
  let params = { concurrency: 2};
  let fns = [
    ...games.map(g => () => firstSearch(g.game, g.categories)),
    ...games.map(g => () => secondSearch(g.game, g.categories)),
  ];
  let results = await Promise.map(fns, fn => fn(), params);
  console.log(results);
 })();
0 голосов
/ 21 октября 2018

Promise.all принимает массив Обещаний в качестве аргумента.Вам нужно передать оба массива как один аргумент массива

return Promise.all(f.concat(s))
  .then(function(g) {
    console.log(g); //only returns `f` result, not the `s`
  });
...