【问题标题】:How to use for loop inside an async function in node.js?如何在 node.js 的异步函数中使用 for 循环?
【发布时间】:2019-09-02 20:10:09
【问题描述】:

我正在尝试使用一堆 ID 登录网页。

我已经使用单个 id 创建了代码并且我的代码正在运行,但我对如何在异步函数中引入循环感到震惊。

const puppeteer = require('puppeteer');

let scrape = async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('URL');
    const id=[IDs];

    for(const i of id)
    {
        await page.$eval('#username', el => el.value = i);
        await page.$eval('#password', el => el.value = 'PASSWORD');
        await page.click('#loginbutton');
        await page.waitFor(1000);
        const result = await page.evaluate(() => {
        let a=document.getElementById('signin-caption').innerText;
        let b=document.getElementById('statusmessage').innerText;
        if(b)
            return b;
        return a;
        });
        await console.log(result);
        if(result.startsWith('You'))
            break;
    }
    await browser.close();
    return result;
 };

scrape().then((value) => {
    console.log(value);
});

收到以下错误: “UnhandledPromiseRejectionWarning:错误:评估失败:ReferenceError:我未定义”

【问题讨论】:

  • 循环就好了。您不能做的是通过 $eval 回调中的闭包访问变量。
  • return b; 然后return a; 放在下一行是没有意义的。它永远不会执行return a; 代码行。此外,await console.log(result); 中的 await 毫无意义。 console.log() 不返回承诺,因此 await 没有任何用处。 await 仅在您等待承诺时才会做一些有用的事情。

标签: javascript node.js loops async-await puppeteer


【解决方案1】:
await page.$eval('#username', (el , i ) => el.value = i , i );

【讨论】:

  • 你能详细说明你的答案吗?
猜你喜欢
  • 2015-04-11
  • 2014-02-06
  • 1970-01-01
  • 2015-02-11
  • 2011-12-03
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 2014-07-09
相关资源
最近更新 更多