Разрешить обещание на конкретное событие у кукловода - PullRequest
0 голосов
/ 04 сентября 2018

Как я могу продолжить работу с кодом моего кукловода после того, как произошло конкретное событие? в некотором роде синхронно. Например, у меня есть следующий код события запроса:

await page.on('request', request => {
  if (request.resourceType() === 'xhr'){
    //do something
  }
});

Код моего кукловода зависит от ответа на вызов AJAX на конкретной странице для заполнения формы. Так что, я думаю, мне нужно сделать функцию события запроса таким образом, чтобы она выполняла обещание при выполнении условий, чтобы использовать его в качестве ссылки позже в коде, но я был бы признателен за некоторые рекомендации по этой теме, поскольку я не очень знаком с асинхронным кодом, ни обещаниями, ни кукловодом. Спасибо!

1 Ответ

0 голосов
/ 04 сентября 2018

Вы можете свернуть page.on('request') в Обещании, прежде чем войти на страницу и подождать, пока это обещание будет выполнено следующим образом:

const observedXhr = new Promise(resolve =>
  page.on('request', request => {
    if (request.resourceType() === "xhr") {
      resolve();
    }
    request.continue();
  })
);

// later in the code

await observedXhr;

// rest of the program after xhr is compleated

Вот полный пример:

const puppeteer = require('puppeteer');

const html = `
<html>
  <body>
    <script>
      fetch('https://swapi.co/api/people/1/');
    </script>
  </body>
</html>`;

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.setRequestInterception(true);

  const observedXhr = new Promise(resolve =>
    page.on('request', request => {
      if (request.resourceType() === "xhr") {
        resolve();
      }
      request.continue();
    })
  );

  await page.goto(`data:text/html,${html}`);

  console.log('before xhr');

  // await for resolved promise
  await observedXhr;

  console.log('after xhr');
  await browser.close();
})();

Этот вопрос расширяет ваш - он будет ценным для вас.

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