【问题标题】:How can I pass variable into an evaluate function that evaluates an async function using Puppeteer?如何将变量传递给使用 Puppeteer 评估异步函数的评估函数?
【发布时间】:2021-05-18 23:56:44
【问题描述】:

我正在使用 Puppeteer。传递的变量不起作用。我需要在浏览器的上下文中使用这个变量。这是代码的精简版:

let currentPost = 1;

await page.evaluate(async (currentPost) => {
    await new Promise((currentPost, resolve, reject) => {
        
        var timer = setInterval(() => {

            console.log(currentPost);
            resolve();
            
        }, 100);

    }); 

}, currentPost); 

【问题讨论】:

  • 它是new Promise((resolve, reject)。从那里删除currentPost。并且不要await它,返回它
  • 另外,您可能在变量阴影方面遇到问题,因为您在不同的上下文中为 3 个变量提供了相同的名称,请尝试在名称方面更具创意;)
  • 我假设正在制作副本并在内部使用其独特的引用进行引用。但我会考虑到这一点。谢谢。我会尝试你的建议并回复你。感谢迅速的反应。另外,我正在执行我需要在返回之前完成的承诺中的一些任务,那么,返回新的承诺会按照您的建议实现吗?
  • @RonB OP 在从 Promise 回调参数列表中删除 currentPost 后应该没问题,因为整个函数由 Puppeteer 在浏览器上下文中序列化和执行。

标签: javascript node.js async-await puppeteer


【解决方案1】:

Promise 接受两个参数:resolve 和 reject。删除当前的 Post arg,它将按预期工作。

let currentPost = 1;

await page.evaluate(async (currentPost) => {
    await new Promise((resolve, reject) => {
        
        var timer = setInterval(() => {

            console.log(currentPost);
            resolve();
            
        }, 100);

    }); 

}, currentPost); 

【讨论】:

  • 现在试试。
  • 工作就像一个魅力。谢谢。
  • 不客气,我的朋友@JohnYepthomi。如果您能接受我的回答,将不胜感激(:
  • 我做到了,很荣幸这样做。 :)
  • 嗯,我不认为答案被我的朋友接受了,你能再试一次@JohnYepthomi吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
相关资源
最近更新 更多