我试图在Array.from()上使用内置的map()
函数,该函数使用Puppeteer返回一些元素。
下面是代码:
let res = await page.evaluate(elementPath => {
return Array.from(document.querySelectorAll(elementPath), (cin, index) => {
return {
cs: `state is ${this.s}`, // returns state is undefined
cinemaIndex: index,
cinemaId: cin.getAttribute('data-id'),
cinemaName: cin.getAttribute('data-name'),
cinemaURL: cin.getAttribute('data-url'),
};
}, {
s: 'NSW'
});
}, `div[data-state=${cinemaState}] div.top-select-option a.eccheckbox`, cinemaState);
我无法为cs
分配变量s
或cinemaState
。
想知道是否有解决方案
答案 0 :(得分:0)
[1,2,3,4].map(function(num, index,wholeArray){
console.log(num,index,wholeArray,this.s);
},{s:"nsw"})
maps接受两个参数callback
和thisArg
,无论您在第二个arg处传递的内容如何,都可以通过this
来访问。
答案 1 :(得分:0)
您可以使用以下方法将return
语句中的s
分配给cinemaState
属性:
cinemaState: this.s,
此外,Array.from()
具有内置的map
函数,因此您应该从map
内调用Array.from()
函数以避免中间数组:
Array.from(arrayLike, mapFn); // good
Array.from(arrayLike).map(mapFn); // bad
最后,您可能希望在模板文字选择器字符串内的属性选择器中使用cinemaState
周围的引号:
[data-state="${cinemaState}"] // good
[data-state=${cinemaState}] // bad
您的最终代码应如下所示:
let res = await page.evaluate(elementPath => {
return Array.from(document.querySelectorAll(elementPath), (cin, index) => {
return {
cinemaState: this.s,
cinemaIndex: index,
cinemaId: cin.getAttribute('data-id'),
cinemaName: cin.getAttribute('data-name'),
cinemaURL: cin.getAttribute('data-url'),
};
}, {
s: 'NSW'
});
}, `div[data-state=${cinemaState}] div.top-select-option a.eccheckbox`, cinemaState);
答案 2 :(得分:0)
我能够解释这一点。这就是对我有用的。我不得不将箭头功能替换为传统功能
let res = await page.evaluate(elementPath => {
return Array.from(document.querySelectorAll(elementPath), function (cin, index) // changed from (cin, index) =>
{
return {
cs: `state is ${this.s}`, // returns state is undefined
cinemaIndex: index,
cinemaId: cin.getAttribute('data-id'),
cinemaName: cin.getAttribute('data-name'),
cinemaURL: cin.getAttribute('data-url'),
};
}, {
s: 'NSW'
});
}, `div[data-state=${cinemaState}] div.top-select-option a.eccheckbox`, cinemaState);