【问题标题】:Creating multiple cookie contexts using the `fetch` API使用 `fetch` API 创建多个 cookie 上下文
【发布时间】:2021-11-07 21:19:48
【问题描述】:

我正在编写一个 Web 扩展,它尝试从基于会话的 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" });

我想并行运行 Fetch 序列 1 和 Fetch 序列 2。问题是,每次我访问 https://url.endpoint/start_session 时,我都会收到一组新的 cookie,并且所有带有 { credentials: "include" } 的 fetch 请求都使用当前设置的 cookie(当 start_session 返回时会被覆盖)。

我的问题是:有没有办法设置多个“会话”,以便这些请求可以与它们自己的 cookie 并行运行?还是有其他解决方法? (看来fetch api 不允许您手动获取或设置Set-Cookie 标头...)

【问题讨论】:

    标签: javascript fetch session-cookies


    【解决方案1】:

    如果你想同时等待两个 Promise 的完成,你可以使用Promise.all。这将创建一个新的 Promise,该 Promise 仅在传递给它的所有 Promise 完成时才解析,但仍允许它们并行运行。在这种情况下,我会等待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" })
    ])
    

    【讨论】:

    • 很遗憾,这行不通。我简化了帖子的情况,但是有多个navigates*需要在最后一页之前依次调用数据。
    • 他们是否覆盖了彼此依赖的 cookie?从概念上讲,没有什么可以阻止您将每个 fetch 包装在另一个 await 函数中,您可以在这些函数中执行一系列必要的等待。如果它们覆盖了各自依赖的 cookie,则您无法并行运行它们,因为它们正在有效地修改共享状态。
    • 是的。他们正在覆盖 cookie。好烦啊……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2020-02-12
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多