Javascript 如何等待对象在异步JS中构造
我从异步JS开始,遇到了一个我无法解决的问题。我和木偶演员一起工作,用的是无头铬合金。我需要处理一个我创建的对象,如下所示:Javascript 如何等待对象在异步JS中构造,javascript,asynchronous,Javascript,Asynchronous,我从异步JS开始,遇到了一个我无法解决的问题。我和木偶演员一起工作,用的是无头铬合金。我需要处理一个我创建的对象,如下所示: const dataLayerPuppeteer = new dataLayer(page, containerId) 之后,我使用返回承诺的方法处理对象,因此我可以使用wait处理它们。然而,问题是,我需要等待对象被创建,直到我使用它,因为我得到的“数据层”是未定义的错误 我的问题是:如何等待这行代码的执行,然后在已定义DataLayerUppeter的情况下继续执行
const dataLayerPuppeteer = new dataLayer(page, containerId)
之后,我使用返回承诺的方法处理对象,因此我可以使用wait处理它们。然而,问题是,我需要等待对象被创建,直到我使用它,因为我得到的“数据层”是未定义的错误
我的问题是:如何等待这行代码的执行,然后在已定义DataLayerUppeter的情况下继续执行其余代码
谢谢
编辑(完整代码):
const puppeteer = require('puppeteer');
const dataLayer = require('puppeteer-datalayer');
(async () => {
// Automate here
const browser = await puppeteer.launch();
const page = await browser.newPage();
const containerId = "GTM-5LDMPBF";
const dataLayerPuppeteer = new dataLayer(page, containerId);
await page.goto('https://www.ifortuna.sk');
await page.click('#header > nav > div.main-navigation > a'),
console.log(await dataLayerPuppeteer.history());
// console.log(await dataLayerPuppeteer.history());
const div = await page.evaluate(() => {return (document.querySelector('p').innerHTML) });
console.log(div);
//await page.click('#header > nav > div.main-navigation > a');
await browser.close();
})();
该代码不会引发该错误。如果它会抱怨datalayerpuppeter
此行未定义:
console.log(await dataLayerPuppeteer.history());
这是因为您使用const
在函数作用域中构造它,因此该变量除了在Promise回调中之外,在任何地方都无效
构造函数不能是异步的,行constdatalayerpuppeter=newdatalayer(page,containerId)
将始终立即同步执行。没有必要用承诺来包装它,也没有必要以任何方式等待它。因此:
const dataLayerPuppeteer = new dataLayer(page, containerId);
...
console.log(await dataLayerPuppeteer.history());
这很好。如果您在其他地方还有其他问题,这是一个单独的主题。如何准确定义
数据层
?这没关系,我只想等待这行代码出现,然后继续我的代码@decezeNo,它告诉您它不知道什么是dataLayer
。它的定义方式和位置非常重要。它是我正在导入的模块中的一个类@deceze显示您是如何准确导入它的…感谢您提供的解决方案,但是我再次编辑了代码,这是当前状态,我收到了以下错误:UnhandledPromisejectionWarning:错误:评估失败:未定义数据层我找不到错误:/@deceze将其减少到最简单的示例console.log(dataLayer)
过程中的每一步。如果我在goto方法之后使用console.log(dataLayer),我会得到:[Function:dataLayer]@deceze