使用 Fetch API 处理嵌套 HTTP 请求

发布日期:2026-07-15 11:17:03   来源 : 杭州电子商务研究院    浏览量 :3
杭州电子商务研究院 发布日期:2026-07-15 11:17:03  
3

介绍

如果您还记得在 JavaScript 中使用 XMLHttpRequest (XHR) 构造发出 HTTP 请求的那些日子,那么您一定特别欣赏更现代的 Fetch API。使用 XHR 请求,JavaScript 开发人员只能使用回调来模拟异步性。Fetch 允许您创建 HTTP 请求,这些请求可以使用 JavaScript Promises 轻松处理。在处理异步控制流方面,Promises 比回调有了很大的进步。当您需要一个接一个地链接多个请求时尤其如此。

在本指南中,您将学习如何有效地处理fetch调用链以避免嵌套。首先,您将了解对链式 HTTP 请求进行建模的简单方法,即使用嵌套调用来fetch。接下来将进行一些优化,包括 Promise 链以及使用asyncawait关键字。

让我们开始吧!

幼稚的方法

使用fetch时你的第一反应可能是这样做:

      // my-component.jsx

// We have to get chips after we get fish...
getFishAndChips() {
    fetch(this.fishApiUrl) // Request fish species
        .then(fishRes => {
            fishRes.json().then(fish => {
                this.fish = fish;

                const fishIds = fish.map(fish => fish.id);

                fetch( // Request chips using fish ids
                        this.chipsApiUrl,
                        {
                            method: 'POST',
                            body: JSON.stringify({ fishIds })
                        }
                    )
                    .then(chipsRes => {
                        chipsRes.json().then(chips => {
                            this.chips = chips;
                        })
                    })
            })
        })
}
    

在上面的代码中,我们嵌套了两个fetch调用,以确保在请求鱼之后请求芯片。这是因为,为了请求芯片,我们需要使用 POST 请求发送鱼 ID 数组。这有效,但是,这里存在很大的可读性问题。可以大大减少此功能所需的代码量。让我们来看看 Promise 链!

获取承诺链

消除这些fetch调用嵌套的第一种方法是使用所谓的 Promise 链。只需在对Promise.then的调用中返回另一个 Promise 即可实现 Promise 链。以下示例显示了如何执行此操作:

      // We have to get chips after we get fish...
getFishAndChips() {
    fetch(this.fishApiUrl) // Request fish species
        .then(response => response.json())
        .then(fish => {
            this.fish = fish;

            const fishIds = fish.map(fish => fish.id);

            return fetch( // Request chips using fish ids
                        this.chipsApiUrl,
                        {
                            method: 'POST',
                            body: JSON.stringify({ fishIds })
                        }
                    );
        })
        .then(response => response.json())
        .then(chips => {
            this.chips = chips;
        });
}
    

这太棒了!代码更易于维护、简洁且易读。但我们可以做得更好!借助 JavaScript 中引入的新 async/await 语法,我们可以完全消除对Promise.then的多次调用!您将在下一节中看到如何实现这一点。

更好的方法:Async/Await

async/await 关键字是一种在计算机程序中建模异步控制流的绝妙机制。在 JavaScript 中,这些关键字是 Promises 之上的语法糖——它们抽象了对Promise.then的调用。在下面的代码中,我们重构了getFishAndChips函数以使用 async/await。

      // We have to get chips after we get fish...
async getFishAndChips() {
    const fish = await fetch(this.fishApiUrl).then(response => response.json());
    this.fish = fish;

    const fishIds = fish.map(fish => fish.id),
      chipReqOpts = { method: 'POST', body: JSON.stringify({ fishIds }) };

    const chips = await fetch(this.chipsApiUrl, chipReqOpts).then(response => response.json());
    this.chips = chips;
}
    

哇!我们大幅压缩了所使用的代码,同时实现了相同的预期效果。干得好!控制流的 async/await 机制是在您的应用内链接 HTTP 请求的一种极其强大的方法。

结论

在本指南中,您学习了如何在链接 HTTP 请求时避免对 JavaScript Fetch API 进行嵌套调用。您了解到,在 Promise 链接和 async/await 中都可以找到解决嵌套fetch调用的方法。毫无疑问,最易读的代码是通过使用 async/await 语法实现的。

现在您可以自信地在 React 组件中编写现代且可读的异步代码!

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据