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

javascript中Promise是什么_如何使用它处理异步呢

阿萱酱_5832

阿萱酱_5832

发布时间:2026-01-05 18:26:03

|

361人浏览过

|

来源于php中文网

原创

Promise 是 JavaScript 中管理异步操作的原生状态容器,具有 pending、fulfilled、rejected 三种不可逆状态;需显式调用 resolve/reject,支持链式处理、错误捕获及 async/await 语法糖。

javascript中promise是什么_如何使用它处理异步呢

Promise 是 JavaScript 中用于管理异步操作的原生对象,它不是语法糖,也不是回调函数的替代品——它是异步流程的“状态容器”,代表一个尚未完成但未来会完成(或失败)的操作。

Promise 的三种状态和基本构造

Promise 实例创建后处于 pending 状态;之后只能变成 fulfilled(成功)或 rejected(失败),且不可逆。构造时必须传入一个执行器函数:new Promise((resolve, reject) => { ... })。

常见误区是直接在构造函数里写异步逻辑却不调用 resolve 或 reject,导致 Promise 永远卡在 pending,后续 .then() 和 .catch() 都不会触发。

  • 必须确保异步任务结束后显式调用 resolve(value) 或 reject(reason)
  • 执行器函数是同步立即执行的,但内部可包含 setTimeout、fetch、XMLHttpRequest 等异步操作
  • resolve 传入 Promise 实例时会自动展开(即“扁平化”),避免嵌套 Promise

用 .then() 和 .catch() 链式处理结果

.then() 接收两个可选参数:onFulfilled 和 onRejected;.catch() 等价于 .then(null, onRejected)。链式调用的关键在于:每个 .then() 返回的是一个新 Promise,其状态由该次回调的返回值决定。

立即学习“Java免费学习笔记(深入)”;

容易踩的坑是误以为 .then() 内部的 return 会“跳出整个链”,其实它只是决定下一个环节的输入值。

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • 如果 .then() 回调返回普通值(如字符串、数字),下一个 .then() 的 onFulfilled 会收到该值
  • 如果返回另一个 Promise,下一个 .then() 会等待它 settle 后再执行
  • 如果回调抛出错误(throw)或返回被 reject 的 Promise,控制权会跳转到最近的 .catch() 或 .then(null, ...)
const p = new Promise(resolve => setTimeout(() => resolve(42), 100));
p.then(x => x * 2)
 .then(y => { throw new Error('oops'); })
 .catch(err => console.log(err.message)); // 输出: oops

常见异步场景下的实际写法(fetch / 定时器 / 并发)

原生 fetch 已返回 Promise,但注意它只在网络错误时 reject,HTTP 状态码如 404、500 仍属于 fulfilled 状态,需手动检查 response.ok。

对于定时器、事件监听等传统回调 API,需要用 Promise 封装才能接入链式流程。

  • 封装 setTimeout:const delay = ms => new Promise(r => setTimeout(r, ms))
  • 并发多个请求用 Promise.all([p1, p2, p3]),任一 reject 整体就 reject;若要全响应,改用 Promise.allSettled
  • 竞速场景(如接口降级)用 Promise.race([fastApi(), fallback()]),谁先 settle 就取谁的结果
function apiWithTimeout(url, timeout = 5000) {
  const controller = new AbortController();
  const id = setTimeout(() => controller.abort(), timeout);
  return fetch(url, { signal: controller.signal })
    .finally(() => clearTimeout(id));
}

async/await 是语法糖,但改变了错误捕获方式

async 函数本质是返回 Promise 的函数,await 只能在其中使用。它让异步代码看起来像同步,但底层仍是 Promise 链。

关键差异在于错误处理:用 try/catch 捕获 await 表达式的 rejection,而传统 .then().catch() 是声明式错误传递,容易漏掉中间环节的异常。

  • await 后面如果不是 Promise,会被自动包装成 Promise.resolve(...)
  • 多个 await 默认串行;想并发请先用 Promise.all 包装好再 await
  • await 在循环中逐个等待很慢,别写 for (x of arr) await doAsync(x),除非真需要串行

最常被忽略的一点:async 函数内部未被 try/catch 包裹的同步错误(比如 undefined.foo())也会被转为 rejected Promise,这点和普通函数不同。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

切问学术

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

豆包大模型

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

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

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

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

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

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

99

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

514

2026.02.06

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

476

2026.05.09

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

399

2026.06.16

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

529

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1658

2024.03.01

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

1958

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1558

2023.08.03

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习

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

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