无法在Promise.all()外部访问数据

时间:2018-11-23 00:43:13

标签: javascript promise

我具有以下代码,可以从电影院站点访问电影会话。我循环使用while循环来获取电影会话。

我打算将循环内的会话添加到在while循环外部声明的数组sessionResults中。

R.是指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

如果您查看//!!! AREA OF CONCERN,我已经在不同地方记录了sessionResults的值。

能否请您说明为什么sessionResults的值未在Promise.all()外部传递?

2 个答案:

答案 0 :(得分:0)

您没有得到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,则需要在异步函数作用域内而不是全局作用域内进行操作(因为它不是异步的)。

答案 1 :(得分:0)

await Promise.all()基于@CertainPerformance的评论进行工作

修改后的代码如下

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

console.log(sessionResults); //  concatenated array