Как я могу сделать асинхронный запрос (неблокирующий) с помощью Cloudflare Worker

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

addEventListener('fetch', event => {
  event.respondWith(handle(event))
})

async function handle(event) {
  const response = await fetch(event.request)

  // Send async analytics request.
  let promise = fetch("https://example.com")
      .then(response => {
    console.log("analytics sent!")
  })

  // If I uncomment this, only then do I see the
  // "analytics sent!" log message. But I don't
  // want to wait for it!
  //  await promise;

  return response
}

1 ответ

Решение

Вам нужно использовать Event.waitUntil() продлить срок действия запроса. По умолчанию все асинхронные задачи отменяются сразу после отправки окончательного ответа, но вы можете использовать waitUntil() продлить время обработки запросов для выполнения асинхронных задач. Вход в waitUntil() должно быть обещанием, которое разрешается, когда задача выполнена.

Итак, вместо:

await promise

делать:

event.waitUntil(promise)

Вот полный рабочий сценарий на игровой площадке.

Другие вопросы по тегам