0

0

解决fetch在then()中首次点击无响应的问题

碧海醫心

碧海醫心

发布时间:2025-11-01 17:50:12

|

722人浏览过

|

来源于php中文网

原创

解决fetch在then()中首次点击无响应的问题

本文旨在解决在使用`fetch` API时,在`.then()`回调中进行异步操作,首次点击事件无响应的问题。通过分析原因,提供使用`return`关键字确保Promise链正确执行,并推荐使用`async/await`语法简化代码,提高可读性和可维护性。同时,针对React环境,讨论了`useState`的异步更新机制,并提供解决方案。

在使用fetch API进行网络请求时,如果在.then()回调中嵌套另一个fetch请求,并且发现第一次点击按钮时,嵌套的fetch请求没有立即生效,导致后续逻辑出现问题,这通常是由于Promise链没有正确处理导致的。

问题分析

问题的核心在于.then()回调中执行的异步操作(即嵌套的fetch请求)并没有被等待。这意味着,当第一个fetch请求完成后,程序会立即执行下一个.then(),而不会等待内部fetch请求完成。因此,listingId可能还没有被正确设置,导致console.log输出错误的值。

解决方案:使用return关键字

为了确保Promise链能够正确地等待内部fetch请求完成,需要在.then()回调中返回该fetch请求的Promise。 这样,外部的.then()才能知道内部的异步操作已经完成。

以下是修改后的代码示例:

async function addListing() {
    let listing = {
        make: make,
        model: model,
        year: year,
        mileage: mileage,
        price: price
    };

    await fetch("http://localhost:8080/api/listing", {
        method: "POST",
        headers: { "Content-type": "application/json" },
        body: JSON.stringify(listing)
    })
    .then(() => {
        return fetch("http://localhost:8080/api/listing") // 关键:返回内部的fetch Promise
        .then(res => res.json())
        .then(data => {
            setListingID(data[data.length - 1].id);
        })
        .catch(error => {
            console.log(error);
        });
    })
    .then(() => {
        console.log("Listing: ", listingId, " Seller: ", sellerId)
    })
    .catch(error => {
        console.log(error)
    })
}

通过添加 return 关键字,.then(() => { console.log("Listing: ", listingId, " Seller: ", sellerId) }) 这段代码会在内部的 fetch 请求完成后才会执行。

更优雅的解决方案:使用async/await

虽然使用.then()和return可以解决问题,但代码可读性相对较差。 推荐使用 async/await 语法,它可以使异步代码看起来更像同步代码,从而提高代码的可读性和可维护性。

以下是使用 async/await 重构后的代码示例:

有道智云AI开放平台
有道智云AI开放平台

有道智云AI开放平台

下载
async function addListing() {
    let listing = {
        make: make,
        model: model,
        year: year,
        mileage: mileage,
        price: price
    };

    try {
        await fetch("http://localhost:8080/api/listing", {
            method: "POST",
            headers: { "Content-type": "application/json" },
            body: JSON.stringify(listing)
        });

        const res = await fetch("http://localhost:8080/api/listing");
        const data = await res.json();
        setListingID(data[data.length - 1].id);
        console.log("Listing: ", listingId, " Seller: ", sellerId);

    } catch (error) {
        console.log(error);
    }
}

使用 async/await 后,代码逻辑更加清晰:

  1. 首先,使用 await 等待 POST 请求完成。
  2. 然后,使用 await 等待 GET 请求完成,并获取数据。
  3. 最后,设置 listingID 并输出日志。

React 中的 useState 异步更新

如果代码运行在 React 环境中,并且使用了 useState 来管理 listingId,需要注意 useState 的更新是异步的。 这意味着,调用 setListingID 后,listingId 的值不会立即更新。

如果在调用 setListingID 后立即使用 listingId,可能会得到旧的值。 为了解决这个问题,可以在设置 listingId 后,立即使用新的值,而不是依赖 useState 的更新。

以下是修改后的代码示例:

async function addListing() {
    let listing = {
        make: make,
        model: model,
        year: year,
        mileage: mileage,
        price: price
    };

    try {
        await fetch("http://localhost:8080/api/listing", {
            method: "POST",
            headers: { "Content-type": "application/json" },
            body: JSON.stringify(listing)
        });

        const res = await fetch("http://localhost:8080/api/listing");
        const data = await res.json();
        const newListingID = data[data.length - 1].id; // 获取新的 listingId
        setListingID(newListingID); // 设置 listingId
        console.log("Listing: ", newListingID, " Seller: ", sellerId); // 使用新的 listingId

    } catch (error) {
        console.log(error);
    }
}

在这个示例中,我们首先将新的 listingId 存储在 newListingID 变量中,然后使用 setListingID 更新状态,并立即使用 newListingID 进行后续操作。 这样可以确保使用的是最新的 listingId 值。

总结

解决 fetch 在 .then() 中首次点击无响应的问题,关键在于确保 Promise 链能够正确等待内部异步操作完成。 可以通过在 .then() 回调中返回 Promise,或者使用 async/await 语法来实现。

如果代码运行在 React 环境中,还需要注意 useState 的异步更新机制,并确保在使用状态值之前,状态已经更新完成。 通过以上方法,可以有效地解决 fetch 请求中的异步问题,并编写出更加健壮和可维护的代码。

相关专题

更多
console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

410

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

477

2024.05.29

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

296

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

391

2023.10.12

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

7

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

42

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.1万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号