无法从递归javascript函数获取值数组

时间:2019-04-19 15:46:43

标签: javascript node.js recursion

我正在抓取喜欢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),则在填充数组之前立即触发。在此递归循环之后运行的任何函数也会发生相同的情况。我什么都没做。

1 个答案:

答案 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);
}