Область действия вложенных асинхронных функций - PullRequest
1 голос
/ 30 марта 2019

У меня есть такая структура кода (включая сокеты и кукловод):

client.on('find', (url) => {
    console.log(url);                         // url == "google.ru"
    (async function(){
        await page.goto(url);                 // url == "google.ru"
        await page.evaluate(async () => {
            var response = await fetch(url);  // url == undefined
            var json = await response.json();
            return json;
        });
    })();
});

Я пробовал некоторые варианты (замыкания и т. Д.), Но не могу заставить его работать. Как правильно передать url переменную?

1 Ответ

2 голосов
/ 30 марта 2019

.evaluate функция обратного вызова выполняется в контексте страницы, а не в контексте основного сценария, поэтому url не определено.

Внутри обратного вызова вы можете получить доступ к любому variable, определенному в глобальном браузере.scope.

Если вы хотите получить доступ к url изнутри .evaluate, вы можете передать его в качестве аргумента.

page.evaluate(async (url) => {
    // browser context
    var response = await fetch(url);  
    var json = await response.json();
    return json;
}, url); // pass it as an argument
...