Узел кукловода Promise.all выдает проблемы при просмотре разных страниц одновременно - PullRequest
1 голос
/ 02 марта 2020

Так что я довольно новичок в изучении веб-страниц и использую для этого библиотеку кукловодов. Мне удается заставить большинство вещей работать, но когда я пытаюсь обещать обещание .all и запускать вторую функцию на расстоянии go на двух отдельных страницах, это всегда последняя страница на карте promise.all, которая идет двумя, хотя в Отладчик должен был перейти на страницу, о которой идет речь.

Функция, которая запускает выборку данных, выглядит как пример кода ниже

const fetchSeasonUrls = async () => {
  const driver = await configuration.getDriver(baseUrl);

  const watchList = await fetchWatchList(driver);

  // When the function below is hit the end result looks like example result one below
  const watchListSeasons = await Promise.all(
    watchList.map(async show => {
      await tvSplurgeio.getSeasonData(driver, show);
    })
  );

  // When the function below is hit the end result looks like example result two below
  const showOne = await tvSplurgeio.getSeasonData(driver, watchList[0]);
  const showTwo = await tvSplurgeio.getSeasonData(driver, watchList[1]);
} 

Example-Result-One

[
  [S01, S02, ..., S31],
  [S01, S02, ..., S31]
]

Example-Result-Two

const showOne = [S01, S02, ..., S10];
const showTwo = [S01, S02, ..., S31];

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

Код кукловода, который возвращает эти данные, выглядит следующим образом.


const tvSplurgeio = {
  getSeasonData: async (driver, show) => {
    let navigationPromise = driver.page.waitForNavigation();
    await driver.page.goto(show.url);
    await navigationPromise;

    await driver.page.waitForSelector(".sidebar-seasons");
    const seasonData = await driver.page.evaluate(() => {
      const allSeasons = document.querySelectorAll(
        'li[class*="sidebar-season"]'
      );

      let data = [];
      Array.prototype.forEach.call(allSeasons, season => {
        Array.prototype.forEach.call(season.children, child => {
          const seasonNumber = parseInt(child.innerText.split(" ")[1], 10);
          data.push(
            seasonNumber < 10 ? `S0${seasonNumber}` : `S${seasonNumber}`
          );
        });
      });
      return data;
    });

    await navigationPromise;
    return seasonData;
  },
}

Я пробовал целую кучу вещей со страницы .waitFor () в ожидании навигационных обещаний, и я не совсем уверен, что это просто неправильное понимание того, что можно сделать с этой библиотекой в ​​promise.alls.

Любая помощь будет признателен, Крис.

1 Ответ

0 голосов
/ 02 марта 2020

У меня есть подозрение, что ваша проблема связана с использованием Promise.all. Кроме того, map более целесообразно использовать, когда вы хотите выполнить операцию над элементами массива, а затем вернуть новый массив с изменениями.

Так как кажется, что вы не используете возвращенное значение из map, я предлагаю вместо этого попробовать forEach и просто перенести каждое возвращаемое значение из tvSplurgeio.getSeasonData() в новый массив seasonData.

const watchList = await fetchWatchList(driver);
const seasonData = [];

watchList.forEach(async show => {
  seasonData.push(await tvSplurgeio.getSeasonData(driver, show));
});
...