Данные не доступны за пределами Promise.all () - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть код ниже для доступа к сеансам кино с сайта кино.Я зацикливаюсь, используя цикл while для получения сеансов фильма.

И я намереваюсь добавить сеансы внутри цикла в массив sessionResults, который объявлен вне цикла while.

R. относится к библиотеке Рамды

let page // passed as an argument to the outer function 

 let sessionResults = [];
  while (currentCinemaIndex < cinemaList.length) {
    await page.goto("www.fakeurl.com");

    const _movies = await movies({ page });

    //Get the sessions for each @_movies
    const _movieSessions = await _movies.map(
      async (_movie, index) => {
       //sessions() returns an array of objects
        const res = (await sessions({ page: page }, index + 1)).map(session => {
          return Object.assign({}, _movie, session);
        });
        return res;
      },
      { page }
    );

//!!! AREA OF CONCERN
    console.log(_movieSessions); // array of promises
    Promise.all(_movieSessions).then(p => {
      sessionResults = R.concat(R.flatten(p), sessionResults);
      // console.log(sessionResults); //  concatenated array 
    });
    console.log(sessionResults); //  [] 
    //while loop logic
    currentCinemaIndex  = //increment currentCinemaIndex  
    limit =// set new limit

Если вы посмотрите на //!!! AREA OF CONCERN, я задокументировал значение sessionResults в разных местах.

Не могли бы вы сообщить, почему значение sessionResults не переносится наружу?Promise.all()

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

await Promise.all() работает на основе комментария от @ CertainPerformance

Пересмотренный код выглядит как

sessionResults = await Promise.all(_movieSessions).then(p => R.flatten(p));

console.log(sessionResults); //  concatenated array 
0 голосов
/ 23 ноября 2018

Вы не получите обновленное значение sessionResults, потому что к тому времени, когда код выполняется до console.log(sessionResults) после Promise.all(...), обещание еще не выполнено.

Следовательно, sessionResults возвращено console.log еще не обновлено.

Вместо этого вы можете использовать await, как показано ниже:

p = await Promise.all(_movieSesions);
sessionResults = R.concat(R.flatten(p), sessionResults);
console.log(sessionResults);

Обратите внимание, что если вы используете await, каквыше, вы должны сделать это внутри области действия асинхронной функции, а не глобальной области (потому что это не асинхронная).

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