我正在抓取喜欢instagram帖子的用户列表。以下代码运行正常:
await click(post);
await sleep(500);
var users = await findAll(user);
var userNames = users.map(async user => {
var userNameText = await user.getText();
return userNameText;
});
var result = await Promise.all(userNames);
console.log(result); // ['user1', 'user2'...]
但是喜欢的模式最初只显示10个用户。要查看其他用户,您必须继续滚动,一次仅加载一个子集。 以下递归函数使滚动滚动向下加载单个用户所需的用户数量:
let likers = [];
await (async function theLoop(i) {
await driver.sleep(400);
findAll(user).then(async t => {
let liker = await t[8].getText();
await scroll(find(modal)); //Scroll inside the modal
await likers.push(liker); //PUSH LIKER TO ARRAY
console.log(liker);
if (--i) {
theLoop(i);
}
});
})(60);
问题是我无法从此功能获取所有用户的列表。如果我执行console.log(likers)
,则在填充数组之前立即触发。在此递归循环之后运行的任何函数也会发生相同的情况。我什么都没做。
答案 0 :(得分:2)
您的问题是您的递归函数没有任何return
,并且您既没有等待findAll().then(…)
也没有等待递归调用。同样,您完全不需要递归,使用async
/ await
您可以(应该)编写一个普通循环:
for (var i=60; --i; ) {
await driver.sleep(400);
const t = await findAll(user); // don't use `then`
let liker = await t[8].getText();
await scroll(find(modal));
likers.push(liker); // nothing to `await` here
console.log(liker);
}