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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法从递归javascript函数获取值数组相关的知识,希望对你有一定的参考价值。

我正在抓一个喜欢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)。在此递归循环之后运行的任何函数都会发生相同的情况。我什么都做不了。

答案

你的问题是你的递归函数没有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);
}

以上是关于无法从递归javascript函数获取值数组的主要内容,如果未能解决你的问题,请参考以下文章

无法从从 sql 数据库读取的 javascript 函数中获取返回数组 [重复]

Javascript - 在递归函数中获取 setTimeout 的返回值

如何在Javascript中从数组中提取值

微信小程序如何及时获取页面循环元素的宽度高度距离左边值函数自调类似递归闪屏selectAllexecglobalDatamapscroll-view

微信小程序如何及时获取页面循环元素的宽度高度距离左边值函数自调类似递归闪屏selectAllexecglobalDatamapscroll-view

如何从异步函数中获取数组的所有值