Создание нескольких контекстов файлов cookie с использованием API «выборки»

#javascript #fetch #session-cookies

Вопрос:

Я пишу веб — расширение, которое пытается параллельно извлекать страницы из API на основе сеанса. API использует файлы cookie для хранения информации о сеансе. Таким образом, будет работать следующая последовательность команд:

 // Fetch sequence 1
await fetch("https://url.endpoint/start_session");
const usefulData1 = await fetch("https://url.endpoint/navigate_to_X",
  { credentials: "include" });
// Fetch sequence 2
await fetch("https://url.endpoint/start_session");
const usefulData2 = await fetch("https://url.endpoint/navigate_to_Y",
  { credentials: "include" });
 

Я хотел бы запустить последовательность выборки 1 и последовательность выборки 2 параллельно. Проблема в том, что каждый раз https://url.endpoint/start_session , когда я получаю доступ, мне отправляется новый набор файлов cookie, и все запросы на извлечение { credentials: "include" } используют установленные в данный момент файлы cookie (которые переопределяются при start_session возврате).

Мой вопрос: есть ли способ настроить несколько «сеансов», чтобы эти запросы могли выполняться параллельно с их собственными файлами cookie? Или есть какой-то другой обходной путь? (Похоже fetch , api не позволит вам получить или установить Set-Cookie заголовок вручную…)

Ответ №1:

Если вы хотите дождаться выполнения сразу двух обещаний, вы можете использовать Promise.all . Это создаст новое обещание, которое будет выполнено только тогда, когда все переданные ему обещания будут выполнены, но все равно позволит им работать параллельно. В этом случае я бы подождал start_session конечной точки, а затем дождался бы одной Promise.all из двух других, как это:

 await fetch("https://url.endpoint/start_session");
const [usefulData1, usefulData2] = await Promise.all([
  fetch("https://url.endpoint/navigate_to_X", { credentials: "include" }),
  fetch("https://url.endpoint/navigate_to_Y", { credentials: "include" })
])
 

Комментарии:

1. К сожалению, это не сработает. Я упростил ситуацию для поста, но есть несколько navigates* , которые нужно вызывать последовательно перед последней страницей I с данными.

2. Перезаписывают ли они файлы cookie, от которых зависят друг от друга? Концептуально ничто не мешает вам оборачивать каждую выборку в другую функцию ожидания, где вы выполняете серию ожиданий, необходимых в рамках этих обещаний. Если они перезаписывают файлы cookie, от которых зависит каждый из них, вы не сможете запускать их параллельно, так как они эффективно изменяют общее состояние.

3. ДА. Они переопределяют файлы cookie. Это довольно раздражает…