JavaScript闭包和异步函数参数
我一直在尝试搜索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;
},
回答如下:从技术上讲,从Java脚本的角度来看,您的代码是正确的, 因此,为了在那一侧使用属性,我们需要将其专门传递给page。$ eval回调。 property
应该在page.$eval
回调中可用。但是page。$ eval的特殊之处在于它的回调是在无头浏览器中]执行的,并且与node.js方法和变量完全分开。
请参见语法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;
},
JavaScript闭包和异步函数参数
我一直在尝试搜索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;
},
回答如下:从技术上讲,从Java脚本的角度来看,您的代码是正确的, 因此,为了在那一侧使用属性,我们需要将其专门传递给page。$ eval回调。 property
应该在page.$eval
回调中可用。但是page。$ eval的特殊之处在于它的回调是在无头浏览器中]执行的,并且与node.js方法和变量完全分开。
请参见语法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;
},