如何从异步/等待函数返回值?

问题描述 投票:2回答:2

使用操纵up将来自2个不同网页的数据收集到数组中以供以后比较。但是,程序不会在继续进行之前等待返回的数组。

async function go(){
  try{
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('www.webpage.com');

    const tds = await page.$$('td');
    const data = [];
    for (let i = 0; i < tds.length; i++){
      const td = tds[i];
      const tdcontent = await page.evaluate(td => td.innerText, td);
      if (tdcontent.length > 5) {
        data[i] = {"content": tdcontent};
      }
    }
    return data;
  } catch (e) {
     console.log(e);
  }
};

(async function main(){
  const returnedData = await go();
  console.log(returnedData.length);
})();

返回data.length0。 nodejs的新功能,以及async编程结构。我认为这是因为在返回.length之前先记录了data

如何以一种可以操作并完成比较的方式返回数据?

node.js ecmascript-6 async-await puppeteer ecmascript-2017
2个回答
3
投票

在这种情况下,我尝试不使用page.$$。相反,我使用document.querySelectorAll并通过元素映射并提取文本。

这里是修改后的代码:

const getTdData = async () => {
  try {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto("http://example.com");

    return page.evaluate(() => {
      // get all td elements
      const tdList = [...document.querySelectorAll("td")]; 
      return tdList.map(element => ({ content: element.textContent }));
    });
  } catch (e) {
    console.log(e);
  }
};

(async function main() {
  const returnedData = await getTdData();
  console.log(returnedData.length);
})();

0
投票

首先,您在page.$$()函数中缺少撇号。您应该将其更改为:

page.$$()

接下来,您正在尝试将不存在的变量传递给const tds = await page.$$('td'); 。您可以通过传递page.evaluate()而不是page.evaluate()来解决此问题:

tds[i]

您的最终结果应如下所示:

td

[如果您仍然遇到问题,则可能要等到使用const tdcontent = await page.evaluate(td => td.innerText, tds[i]); 完全加载页面,或者等到使用const go = async () => { try { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('www.webpage.com'); const tds = await page.$$('td'); const data = []; for (let i = 0; i < tds.length; i++) { const tdcontent = await page.evaluate(td => td.innerText, tds[i]); if (tdcontent.length > 5) { data[i] = { content: tdcontent, }; } } return data; } catch (error) { console.log(error); } }; (async function main() { const returnedData = await go(); console.log(returnedData.length); })(); 将有问题的元素添加到DOM中后,才可以使用:

page.goto( ... , { waitUntil: 'networkidle0' })
© www.soinside.com 2019 - 2024. All rights reserved.