0

0

js异步promise链式调用_js异步promise链式写法解析

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-06-19 20:21:04

|

676人浏览过

|

来源于php中文网

原创

promise链式调用通过.then()返回新promise实现异步顺序执行,错误使用.catch()捕获并置于链末尾确保全局捕获;async/await以同步方式简化异步代码,用try/catch处理错误;promise.all适用于并行任务全成功才继续,而promise.race用于响应首个完成的任务。例如链式调用中每个.then()返回新promise决定后续状态,错误在.catch()中集中处理;async函数内用await等待异步结果,结构更清晰;promise.all接收多个promise数组并等全部成功或任一失败,promise.race则取最快完成的结果。

js异步promise链式调用_js异步promise链式写法解析

异步 Promise 链式调用,简单来说,就是让一堆需要按顺序执行的异步操作,像链条一样一个接一个地执行,避免回调地狱,让代码更清晰易懂。

js异步promise链式调用_js异步promise链式写法解析

Promise 链式调用,让异步操作更像同步代码,可读性更高,也更容易维护。

js异步promise链式调用_js异步promise链式写法解析

Promise 链的本质是,每个.then()方法都会返回一个新的 Promise 对象。这个新的 Promise 对象的状态,取决于.then()中回调函数的返回值。如果回调函数返回一个 Promise,那么新的 Promise 的状态就会和这个返回的 Promise 的状态保持一致;如果回调函数返回一个普通值,那么新的 Promise 的状态就会变成 resolved,并且这个返回值会作为下一个.then()方法的回调函数的参数。

js异步promise链式调用_js异步promise链式写法解析
function asyncTask(value) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const result = value * 2;
      console.log(`Task completed with result: ${result}`);
      resolve(result);
      //reject('Something went wrong'); // 模拟错误
    }, 500);
  });
}

asyncTask(5)
  .then(result => {
    console.log('First then:', result);
    return asyncTask(result); // 返回一个新的Promise
  })
  .then(result => {
    console.log('Second then:', result);
    return asyncTask(result); // 再次返回一个新的Promise
  })
  .then(result => {
    console.log('Third then:', result);
    return "Finished!";
  })
  .then(finalResult => {
    console.log('Final result:', finalResult);
  })
  .catch(error => {
    console.error('Error occurred:', error);
  })
  .finally(() => {
    console.log('Chain completed');
  });

如何处理 Promise 链中的错误?

Promise 链中的错误处理,主要依赖.catch()方法。.catch()方法会捕获链中任何一个 Promise 的 reject 状态。这意味着,如果链中任何一个 Promise 抛出错误,.catch()方法就会被调用。需要注意的是,.catch()方法只会捕获它之前的 Promise 的错误。如果想要处理整个链的错误,应该在链的末尾添加.catch()方法。

一点PPT
一点PPT

一句话生成专业PPT,AI自动排版配图

下载
asyncTask(5)
  .then(result => {
    console.log('First then:', result);
    return asyncTask(result);
  })
  .then(result => {
    console.log('Second then:', result);
    throw new Error("Simulated error in second then"); // 模拟错误
    return asyncTask(result);
  })
  .then(result => {
    console.log('Third then:', result);
    return "Finished!";
  })
  .then(finalResult => {
    console.log('Final result:', finalResult);
  })
  .catch(error => {
    console.error('Error occurred:', error); // 这里会捕获到 "Simulated error in second then"
  })
  .finally(() => {
    console.log('Chain completed');
  });

Async/Await 如何简化 Promise 链?

Async/Await 是 ES2017 引入的语法糖,可以更简洁地处理 Promise。使用 Async/Await 可以让异步代码看起来更像同步代码,从而提高代码的可读性和可维护性。Async 函数会隐式地返回一个 Promise,而 Await 关键字会暂停 Async 函数的执行,直到 Promise 的状态变成 resolved。

async function runTasks() {
  try {
    let result = await asyncTask(5);
    console.log('First result:', result);

    result = await asyncTask(result);
    console.log('Second result:', result);

    result = await asyncTask(result);
    console.log('Third result:', result);

    console.log('Finished!');
  } catch (error) {
    console.error('Error occurred:', error);
  } finally {
    console.log('Tasks completed');
  }
}

runTasks();

Async/Await 实际上是 Promise 的语法糖,底层依然是 Promise。使用 Async/Await 可以避免.then()方法的嵌套,让代码更易于理解。Async/Await 的错误处理使用 try...catch 语句,也比 Promise 的.catch()方法更直观。

Promise.all 和 Promise.race 的应用场景

Promise.allPromise.race 是处理多个 Promise 的工具函数。Promise.all 接收一个 Promise 数组,并返回一个新的 Promise。这个新的 Promise 会在所有 Promise 都变成 resolved 状态时变成 resolved,或者在任何一个 Promise 变成 rejected 状态时变成 rejected。Promise.race 也接收一个 Promise 数组,并返回一个新的 Promise。这个新的 Promise 会在第一个 Promise 变成 resolved 或 rejected 状态时,就立即变成对应的状态。

  • Promise.all: 适合处理需要并行执行的异步操作,例如同时请求多个 API 接口,等待所有接口都返回数据后,再进行下一步处理。
const promise1 = asyncTask(5);
const promise2 = asyncTask(10);
const promise3 = asyncTask(15);

Promise.all([promise1, promise2, promise3])
  .then(results => {
    console.log('All results:', results); // [10, 20, 30]
  })
  .catch(error => {
    console.error('Error occurred:', error);
  });
  • Promise.race: 适合处理竞态条件,例如设置一个超时时间,如果异步操作在超时时间内没有完成,就认为操作失败。
const promise = asyncTask(5);
const timeout = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('Timeout');
  }, 1000);
});

Promise.race([promise, timeout])
  .then(result => {
    console.log('Result:', result); // 如果 promise 在 1 秒内完成,则输出结果
  })
  .catch(error => {
    console.error('Error occurred:', error); // 如果超时,则输出 'Timeout'
  });

选择使用 Promise.all 还是 Promise.race,取决于具体的业务场景。如果需要等待所有异步操作都完成,就使用 Promise.all;如果只需要等待第一个异步操作完成,或者需要处理竞态条件,就使用 Promise.race

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1948

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

658

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2401

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

444

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

531

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.07.28

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

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

共58课时 | 6万人学习

ASP 教程
ASP 教程

共34课时 | 5.9万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

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

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