Javascript闭包和异步函数参数

时间:2019-10-10 19:09:40

标签: javascript node.js ecmascript-6 puppeteer

我一直在尝试搜索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;
},

1 个答案:

答案 0 :(得分:0)

从技术上讲,从Java脚本的角度来看,您的代码是正确的,property回调中应提供page.$eval 。但是page。$ eval的特殊之处在于它的回调在无头浏览器中执行 ,并且与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;
},