将参数传递给map()

时间:2018-11-05 03:46:21

标签: javascript node.js google-chrome-devtools puppeteer headless-browser

我试图在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分配变量scinemaState

想知道是否有解决方案

3 个答案:

答案 0 :(得分:0)

[1,2,3,4].map(function(num, index,wholeArray){
    console.log(num,index,wholeArray,this.s);
},{s:"nsw"})

maps接受两个参数callbackthisArg,无论您在第二个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);