我具有以下代码,可以从电影院站点访问电影会话。我循环使用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()
外部传递?
答案 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