Javascript 如何在puppeter中的'wait page.evaluate(indexTotal=>;{`中使用我现有的函数global.parseData(id、name、url)?

Javascript 如何在puppeter中的'wait page.evaluate(indexTotal=>;{`中使用我现有的函数global.parseData(id、name、url)?,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,问题: RETURNED OBJECT: {} LARGE OBJECT: {data} RETURNED OBJECT: {} RETURNED OBJECT: {} RETURNED OBJECT: {} 在页面中使用my global.parseData函数的正确语法是什么 编辑: RETURNED OBJECT: {} LARGE OBJECT: {data} RETURNED OBJECT: {} RETURNED OBJECT: {} RETURNED OBJECT: {} 当

问题:

RETURNED OBJECT: {}
LARGE OBJECT: {data}
RETURNED OBJECT: {}
RETURNED OBJECT: {}
RETURNED OBJECT: {}
页面中使用my global.parseData函数的正确语法是什么


编辑:

RETURNED OBJECT: {}
LARGE OBJECT: {data}
RETURNED OBJECT: {}
RETURNED OBJECT: {}
RETURNED OBJECT: {}
当前代码:

getData.js

    getData: function() {

            let getData = async () => {
                url = 'url';

                await page.exposeFunction('parseData', (items2, items3, item2, ...) => global.parseData(items2, items3, item2, ...));

                const thedata = await page.evaluate( async() => {

                    var items = [];
                    var items2 = [];
                    var items3 = [];

                    $('.htmlElement').find('.childElements').each(function(ind) {
                        ...

                        var returnedObject = await window.parseData(items2, items3, item2, ...);

                        items.push(returnedObject.item);
                        items2 = returnedObject.items2;
                        items3 = returnedObject.items3;

                    });

                    var largeObject = {
                        items: items,
                        items2: items2,
                        items3: items3
                    }

                    console.log("RETURNED OBJECT: "+JSON.stringify(returnedObject));

                    return largeObject;

                }).catch( error => {
                    console.log("ERROR: "+error);
                });

                browser.close();
                return thedata;
            }

            getData().then(largeObject => {

                global.saveData(largeObject);

            });
    }
app.js

global.parseData = function(items2, items3, item2, ...) {

    ...


    if(!item2 || item2 == "") {
        ...
    }
    else {
        items2.push(item2);
        var item3 = ...;
        items3.push(item3);
    }

    var item = {
        ...
    }

    var largeObject = {
        item: item,
        items2: items2,
        items3: items3
    }

    console.log("LARGE OBJECT: "+JSON.stringify(largeObject));

    return largeObject;
}
CONSOLE.LOG输出:

RETURNED OBJECT: {}
LARGE OBJECT: {data}
RETURNED OBJECT: {}
RETURNED OBJECT: {}
RETURNED OBJECT: {}
问题 错误来自代码的这一部分:

page.evaluate((global.parseData(id、名称、url))/。。。
必须将函数传递到
页面。首先使用参数计算
。此处传递的是参数和函数调用的混合

解决方案 要在浏览器上下文中使用Node.js环境中的函数,需要使用公开它

代码示例

//向页面公开函数
等待page.exposeFunction('parseData',(id、名称、url)=>{
//计算
返回“结果”;
});
//备选方案:调用另一个函数
等待page.exposeFunction('parseData2',(id、名称、url)=>global.parseData(id、名称、url));
//在页面内运行代码
等待页面。评估(异步(索引)=>{
//在页面内运行代码,设置变量
// ...
const result=await window.parseData(id、name、url);//调用Node.js函数
},指数);

@TheProgrammer您可以从公开的函数中调用您的全局函数。更改了答案以包含一个示例。我可以看到global.parseData正在通过其console.logs执行,并且最终返回的值确实包含global.parseData中的数据。但结果实际上分配了一个空对象。我想知道可能是什么造成这种情况的原因。@程序员在看不到代码的情况下很难说出问题所在。您是否试图从
页面传递DOM节点。评估
可能?我已使用其他代码/上下文更新了我的问题。此外,我无法将Wait放在window.parseData前面,因为出现以下错误:
语法错误:Wait仅在async f中有效函数
@程序我的代码中缺少一个
异步
。我添加了它。