讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋静大大_8121

秋静大大_8121

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

|

742人浏览过

|

来源于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 语法,它可以使异步代码看起来更像同步代码,从而提高代码的可读性和可维护性。

wechat-article-extraction-mp-weixin-qq-com news-webpage-cleaning blog-post-parsing metadata-extraction-title-author-date multiple-output-formats-markdown-json-plain-text batch-processing-support
wechat-article-extraction-mp-weixin-qq-com news-webpage-cleaning blog-post-parsing metadata-extraction-title-author-date multiple-output-formats-markdown-json-plain-text batch-processing-support

基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。

下载

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

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 请求中的异步问题,并编写出更加健壮和可维护的代码。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

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

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

816

2023.08.08

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

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

5943

2024.05.29

promise的用法
promise的用法

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

4300

2023.10.12

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

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

3703

2023.10.12

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

20

2026.10.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

20

2026.10.10

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

0

2026.10.10

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

20

2026.10.10

C++类与对象的封装方法教程
C++类与对象的封装方法教程

C++封装是面向对象编程的核心特性之一,通过类将数据与操作数据的函数组织在一起,并利用访问权限控制外部访问。本专题介绍类的定义、成员变量、成员函数以及public、private和protected的使用方法,帮助初学者掌握封装的基本原理。

20

2026.10.10

热门下载

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

精品课程

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

共58课时 | 12.1万人学习

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

共12课时 | 1.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn