Как передать переменную в стрелочную функцию?

Я хочу использовать параметр селектора внутри стрелочной функции для оператора if. Но внутри оператора if () я получаю сообщение об ошибке, в котором говорится, что этот селектор не определен. Есть ли способ исправить это?

static async valuesToArray(selector: string): Promise<void> {
    const data: (string | Date)[] = await page.$$eval(selector, cells =>
      cells.map(cell => {
        if (selector === contractsPo.contractDateCol) {
          return new Date(
            cell.textContent!.replace(/(\d{2}).(\d{2}).(\d{4})/, '$2/$1/$3'),
          );
        } else {
          return cell.textContent!;
        }
      }),
    );
  }
page.$$eval
([aria-colindex="2"])
— 59ms
Evaluation failed: ReferenceError: selector is not defined
    at eval (eval at evaluate (:303:29), <anonymous>:2:13)
    at Array.map (<anonymous>)
    at eval (eval at evaluate (:303:29), <anonymous>:1:16)
    at UtilityScript.evaluate (<anonymous>:305:22)
    at UtilityScript.<anonymous> (<anonymous>:1:44)

person Vladimir Krygin    schedule 06.04.2021    source источник
comment
Я думаю, вам нужно передать переменную в качестве дополнительного аргумента eval: page.$$eval(selector, (cells, selector) => { ... }, selector). stackoverflow .com / questions / 59899932 /   -  person Đinh Carabus    schedule 06.04.2021
comment
Это драматург или кукловод?   -  person hardkoded    schedule 06.04.2021
comment
@hardkoded, это драматург, но я нашел этот метод хранения значений в виде массива на доске кукловода   -  person Vladimir Krygin    schedule 06.04.2021


Ответы (1)


Вам также нужно передать переменную в функцию. Вместо этого должно выглядеть примерно так:

static async valuesToArray(selector: string): Promise<void> {
    const data: (string | Date)[] = await page.$$eval((selector, cells) => {
        cells.map(cell => {
            if (selector === contractsPo.contractDateCol) {
                return new Date(
                cell.textContent!.replace(/(\d{2}).(\d{2}).(\d{4})/, '$2/$1/$3'),
                );
            } else {
                return cell.textContent!;
            }
        }),
    }, selector, cells); // This is the important part of passing in the selector.
}

Обычно я использую page.evaluate вот так, а затем document.querySelectorAll внутри функции, но это не должно отличаться:

await page.evaluate((selector, cells) => {
    // Your code here

}, selector, cells); // Again, be sure to actually pass in the selector here.

person wolfy    schedule 06.04.2021