ReferenceError пытается получить доступ к закрывающей переменной внутри обратного вызова await в node.js - PullRequest
0 голосов
/ 06 февраля 2020

(Я просмотрел похожие вопросы и не смог найти ответ на свою проблему, поэтому спрашиваю здесь.)

Почему код ниже выдает ошибку «ReferenceError: myText notfined»?

    async myFunction(myText: string)
    {
        await this.asyncThing.evaluate(() => {
            console.log(myText);  // error is thrown here
        });
    }

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

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Похоже, вы используете Puppeteer. Хотя функция, которую вы передаете evaluate, выглядит как обычное закрытие, она на самом деле сериализуется и отправляется через провод в браузер. Это означает, что он фактически не закрывает / не имеет доступа к переменным в родительской области видимости. Вместо этого вы должны явно передать эти переменные в качестве аргументов функции evaluate:

async myFunction(myText: string)
{
    await this.asyncThing.evaluate((myTextInBrowser) => {
        console.log(myTextInBrowser);
    }, myText); // <- pass the variable in here
}

Это не очень хорошо указано в документации, но это в разделе "Передача аргументов в pageFunction:" https://pptr.dev/#? продукт = Кукольник & версия = v2.1.1 & шоу = апи-pageevaluatepagefunction-арг

0 голосов
/ 06 февраля 2020

Переменная не видна внутри замыкания, потому что замыкание не имеет аргумента.

Рассмотрим

await this.asyncThing.evaluate((myText) => {
    console.log(myText);
});
...