【问题标题】:Javascript Closure and async function argumentsJavascript 闭包和异步函数参数
【发布时间】:2019-10-11 11:30:26
【问题描述】:

我一直在尝试搜索 SO,但仍然没有运气,我需要将以下“属性”参数传递给匿名函数,但由于关闭它无法访问。

存档的最佳方式是什么? (页面是来自 Puppeteer 的对象):

getCssProperty: async function(selector, property) {
    await page.waitForSelector(selector);
    var val = await page.$eval(selector, x => {

        return window.getComputedStyle(x).getPropertyValue(property); <- here it does not work, undefined
    });
    return val;
},

【问题讨论】:

  • “由于闭包无法访问”代码的范围正确,property 在回调函数中可用。该值为undefined 似乎是调用getCssProperty 的位置的问题。

标签: javascript node.js ecmascript-6 puppeteer


【解决方案1】:

从技术上讲,从 Javascript 的角度来看,您的代码是正确的,property 应该page.$eval 回调中可用。但是 page.$eval 的特殊之处在于它的回调在 headless 浏览器中执行,并且与 node.js 的方法和变量完全分离。

因此,为了使用该侧的属性,我们需要专门将其传递给 page.$eval 回调。

见语法in the docs:

page.$eval(selector, pageFunction[, ...args])

args 是我们想要传递的任何变量,它们必须可以使用 JSON.stringify() 进行序列化。

因此这里是修复getCssProperty的方法:

getCssProperty: async function(selector, property) {
    await page.waitForSelector(selector);
    var val = await page.$eval(selector, (x, property) => { // <-- accept here the element AND arguments

        return window.getComputedStyle(x).getPropertyValue(property);

    }, 
    property // <-- pass property over to page.$eval callback
    ); 
    return val;
},

【讨论】:

  • 优秀的瓦维洛夫!它工作得很好!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 2018-09-07
  • 2017-08-01
  • 2021-12-20
  • 2018-09-19
  • 1970-01-01
相关资源
最近更新 更多