Node.js Возвращает переменную из обработчика события в родительскую функцию - PullRequest
0 голосов
/ 30 июня 2018

Мне нужна функция scrape для возврата значения, полученного в обработчике события page.on("request").

async function scrape(url) {
        const page = await browser.newPage();
        await page.setRequestInterception(true);

        page.on("request", async(request) => {
            return "fish"
        }
        await page.goto(url)
    }

В настоящее время:

const ans = await scrape(url)
console.log(ans)
"undefined'

Ожидаемый:

const ans = await scrape(url)
console.log(ans)
"fish"

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

вам нужно будет вернуть обещание, которое будет выполнено, когда вы увидите ожидаемое событие

const matchRequest = request => request.method() === 'GET'; // your filter
async function scrape(url) {
  return new Promise(resolve => {
    const page = await browser.newPage();
    // not sure what your logic is, but if you don't need to cancel or modify requests/resposes you probably don't need interception
    // await page.setRequestInterception(true);
    page.on("response", async(response) => {
        if (matchRequest(response.request())) {
           resolve(response.buffer());
        }
    }
    await page.goto(url);
  })
}

const body = await scrape('https://example.com');
0 голосов
/ 01 июля 2018

Попробуйте выполнить следующее:

async function scrape(url) {
    let sendRequest = []
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    await page.setRequestInterception(true)
    page.on('request', request => {
      request.continue()
      sendRequest.push('fish')
    })
    await page.goto(url)
    return sendRequest
}

Использование request.continue() для продолжения запроса с необязательными переопределениями запроса. Чтобы использовать это, перехват запроса должен быть включен с помощью page.setRequestInterception. Исключение выдается немедленно, если перехват запроса не разрешен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...