Передача аргументов в map () - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь использовать встроенную функцию map() в Array.from (), которая возвращает некоторые элементы с помощью 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.

Интересно, если у вас есть решение

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Вы можете присвоить s свойству cinemaState в своем выражении return, используя следующий метод:

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);
0 голосов
/ 07 ноября 2018

Я могу объяснить это. это то, что сработало для меня. Мне пришлось заменить функцию стрелки на традиционную функцию

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);
0 голосов
/ 05 ноября 2018
[1,2,3,4].map(function(num, index,wholeArray){
    console.log(num,index,wholeArray,this.s);
},{s:"nsw"})

maps принимает два аргумента callback и thisArg независимо от того, что вы передадите во второй аргумент, будет доступно bi this

...