首页 > 其他分享 >Promise 最佳实践

Promise 最佳实践

时间:2023-04-14 18:59:22浏览次数:30  
标签:异步 console xhr 实践 最佳 Promise error new

如何使用 Promise 处理异步请求

Web 前端开发经常涉及到处理异步请求的场景,例如从后端获取数据或调用浏览器 API 等。在 JavaScript 中,Promise 对象是一种用于处理异步操作的特殊对象,它可以使异步操作更加简单和可读。下面将介绍如何使用 Promise 处理异步请求,并提供一些最佳实践供您参考。

Promise 简介

Promise 对象是一种用于处理异步操作的特殊对象,它有三种状态:

  • pending(进行中):初始状态,不是成功或失败状态。

  • fulfilled(已成功):意味着操作成功完成。

  • rejected(已失败):意味着操作失败。

当 Promise 对象处于 pending 状态时,可以使用 then() 方法指定成功和失败的回调函数。如果 Promise 对象已经处于 fulfilled 或 rejected 状态,将立即执行相应的回调函数。下面是一个使用 Promise 处理异步请求的示例代码:

 1 function getData(url) {
 2   return new Promise((resolve, reject) => {
 3     const xhr = new XMLHttpRequest();
 4     xhr.open("GET", url);
 5     xhr.onload = () => {
 6       if (xhr.status === 200) {
 7         resolve(xhr.responseText);
 8       } else {
 9         reject(new Error(xhr.statusText));
10       }
11     };
12     xhr.onerror = () => reject(new Error("Network Error"));
13     xhr.send();
14   });
15 }
16 
17 getData("https://example.com/todos/1")
18   .then((data) => console.log(data))
19   .catch((error) => console.error(error));

 

  

Promise 的最佳实践

下面是一些使用 Promise 的最佳实践:

1. 将 Promise 封装在函数中

将 Promise 封装在函数中可以使代码更易读和易维护。下面是一个获取用户信息的函数示例:

 1 function getUserInfo(userId) {
 2   return new Promise((resolve, reject) => {
 3     const xhr = new XMLHttpRequest();
 4     xhr.open("GET", `/api/users/${userId}`);
 5     xhr.onload = () => {
 6       if (xhr.status === 200) {
 7         resolve(JSON.parse(xhr.responseText));
 8       } else {
 9         reject(new Error(xhr.statusText));
10       }
11     };
12     xhr.onerror = () => reject(new Error("Network Error"));
13     xhr.send();
14   });
15 }
16 
17 getUserInfo(1)
18   .then((userInfo) => console.log(userInfo))
19   .catch((error) => console.error(error));

2. 使用 Promise.all() 并行执行多个请求

Promise.all() 方法可以并行执行多个 Promise 对象,并在所有 Promise 对象都成功时返回结果。下面是一个并行执行多个请求的示例代码:

1 const promise1 = getData("/api/data1");
2 const promise2 = getData("/api/data2");
3 
4 Promise.all([promise1, promise2])
5   .then(([data1, data2]) => {
6     console.log(data1);
7     console.log(data2);
8   })
9   .catch((error) => console.error(error));

3. 使用 Promise.race() 竞速执行多个请求

Promise.race() 方法可以竞速执行多个 Promise 对象,并返回第一个完成的 Promise 对象的结果。下面是一个竞速执行多个请求的示例代码:

1 const promise1 = new Promise((resolve) => setTimeout(() => resolve("result1"), 1000));
2 const promise2 = new Promise((resolve) => setTimeout(() => resolve("result2"), 500));
3 
4 Promise.race([promise1, promise2])
5   .then((result) => console.log(result))
6   .catch((error) => console.error(error));

4. 使用 async/await 简化 Promise 的使用

async/await 是一种基于 Promise 的语法糖,可以更简单地编写异步代码。使用 async/await,可以将 Promise 链式调用改为顺序调用,并使用 try/catch 语句处理错误。下面是一个使用 async/await 处理异步请求的示例代码:

 1 async function getUserInfo(userId) {
 2   try {
 3     const response = await fetch(`/api/users/${userId}`);
 4     const userInfo = await response.json();
 5     return userInfo;
 6   } catch (error) {
 7     console.error(error);
 8   }
 9 }
10 
11 getUserInfo(1).then((userInfo) => console.log(userInfo));

总结

Promise 是一种用于处理异步操作的特殊对象,它可以使异步操作更加简单和可读。最佳实践包括将 Promise 封装在函数中、使用 Promise.all() 并行执行多个请求、使用 Promise.race() 竞速执行多个请求和使用 async/await 简化 Promise 的使用。使用这些技巧可以使异步代码更加易读和易维护。

标签:异步,console,xhr,实践,最佳,Promise,error,new
From: https://www.cnblogs.com/weblf/p/17319300.html

相关文章

  • 求助 iOS 分发的最佳实践
    目前组里准备开一个iOS的项目,但是还在调研阶段,不太清楚使用哪种分法方式比较合理。理想的方式是:每次发布可以不需要AppStore审核(非必需)不公开发布,仅需要内部分发用户使用量不会特别大(不超过100),但是需要可以自助下载和安装,例如使用GiftCode或者点击一个链接就可以下载可......
  • 求助 iOS 分发的最佳实践
     目前组里准备开一个iOS的项目,但是还在调研阶段,不太清楚使用哪种分法方式比较合理。理想的方式是:每次发布可以不需要AppStore审核(非必需)不公开发布,仅需要内部分发用户使用量不会特别大(不超过100),但是需要可以自助下载和安装,例如使用GiftCode或者点击一个链......
  • 物联网前沿实践【2】-信号处理基础
    参考:https://iot-book.github.io/2_%E4%BF%A1%E5%8F%B7%E5%A4%84%E7%90%86%E5%9F%BA%E7%A1%80/S1_%E4%BF%A1%E5%8F%B7%E7%9A%84%E5%8F%91%E9%80%81%E5%92%8C%E6%8E%A5%E6%94%B6/ 我们首先可以尝试一下用声音信号模拟,简单生成声音信号、录音以及播放录音文件的代码如下;%%制造......
  • 【js】setTimeout、Promise、Async/Await 的区别
    三者在事件循环中的是不同的,事件循环中分为宏任务队列和微任务队列 其中setTimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行;promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行;async函数表示函数里面可能会有异步方法,a......
  • 时序建模算法库PaddleTS技术与实践1
            ......
  • openGauss 之物理备份与恢复实践操作(gs_probackup)
    openGauss之物理备份与恢复实践操作(gs_probackup)本文出处:https://www.modb.pro/db/426207一、gs_probackup简单介绍gs_probackup是一个用于管理openGauss数据库备份和恢复的工具,支持全量备份、增量备份、定期备份和远程备份,还可以设置备份的留存策略。二、gs_probackup使用......
  • 谷雨策划:从落地实践的角度探索CMDB数据运营的破局之道!
    CMDB作为数字化运维的基石为各个IT系统提供可用性保障,CMDB不仅是企业的资源地图、数据央行,更是企业IT流程化和管理问题的抓手,但在CMDB建设和运营过程中,常常会出现IT数据孤岛、数据质量问题、数据完整性、数据消费场景薄弱甚至推广难,不好用,用不起来等问题。然而随着数字化转型的不断......
  • 考虑泄流效应的光伏无功优化matlab 以IEEE33节点为例,分析泄流效应下,最佳网络无功补偿
    考虑泄流效应的光伏无功优化matlab以IEEE33节点为例,分析泄流效应下,最佳网络无功补偿方案,程序运行稳定ID:14120679795515686......
  • REST API 设计规范:最佳实践和示例
    REST(RepresentationalStateTransfer)是一种基于HTTP协议的Web架构风格,它的出现大大简化了Web应用的开发和维护工作,成为现代Web开发的基础。RESTfulAPI设计规范是Web应用开发的重要一环,本文将从特点与技术现状、设计规范、应用场景和发展趋势四个方面进行介绍。正文开......
  • 【实践篇】基于CAS的单点登录实践之路
    作者:京东物流 赵勇萍前言上个月我负责的系统SSO升级,对接京东ERP系统,这也让我想起了之前我做过一个单点登录的项目。想来单点登录有很多实现方案,不过最主流的还是基于CAS的方案,所以我也就分享一下我的CAS实践之路。什么是单点登录单点登录的英文名叫做:SingleSignOn(简称SSO)。......