Закрытие Javascript и аргументы асинхронной функции - PullRequest
0 голосов
/ 10 октября 2019

Я пытался искать на SO, но все же не повезло, мне нужно передать следующий аргумент "свойства" анонимной функции, но из-за закрытия она недоступна.

Какой лучший способ архивироватьэто? (страница - объект от Кукловода):

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;
},

1 Ответ

0 голосов
/ 11 октября 2019

Технически, с точки зрения Javascript, ваш код верен, property должен быть доступным в page.$eval обратном вызове. Но page. $ Eval отличается тем, что его обратный вызов выполняется в браузере без заголовка и полностью отделен от методов и переменных node.js.

Итак, чтобы использовать свойство для этогосторона, нам нужно специально передать его на страницу обратного вызова.

См. Синтаксис в документах :

page. $ Eval (селектор, 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;
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...