简体   繁体   中英

Data not accessible outside Promise.all()

I have the below code to access movie sessions from a cinema site. I am looping using a while loop to fetch movie sessions.

And I intend to add the sessions within the loop to array sessionResults which is declared outside the while loop.

R. refers to the Ramda library

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

If you look at //!!! AREA OF CONCERN //!!! AREA OF CONCERN I have documented the value of sessionResults at different places.

Could you please advise why the value of sessionResults is not carried through outside Promise.all() ?

You don't get the updated value of sessionResults because by the time the code executes until the console.log(sessionResults) after Promise.all(...) , the promise has not resolved yet.

Therefore, the sessionResults returned by console.log is not yet updated.

What you can do instead is use await like below:

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

Please note that if you would use await like above, you need to do it inside an async function scope and not the global scope (because it is not async).

await Promise.all() worked based on comment from @CertainPerformance

Revised code looks like

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

console.log(sessionResults); //  concatenated array 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM