• ES6 Promise 详解


    目录

    一、Promise基本介绍

    二、Promise实现多次请求

            1.传统Ajax方式实现多次请求 : 

                1.1 json数据准备

                1.2 JQuery操作Ajax

            2.使用ES6新特性Promise方式 : 

    三、Promise代码重排优化

            1.问题分析 : 

            2.代码优化 : 

                2.1 数据准备

                2.2 代码重排


    一、Promise基本介绍

            (1) Ajax方式的异步调用在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,称为"Callback Hell" (回调地狱)。
            (2) Promise即是异步编程的一种解决方案,早在 ECMAScript 2015 (ES6) 中便成为标准。
            (3) 从语法层面讲,Promise是一个对象,用来获取异步操作的信息


    二、Promise实现多次请求

            1.传统Ajax方式实现多次请求 : 

                1.1 json数据准备

                    通过student和student_detail_1两个json文件来简单模拟测试数据;第一次请求得到student.json中保存的数据,第二次请求通过前一次请求得到的数据,进一步得到student_detail_1.json中保存的数据(即先得到student.json中的id属性,根据该属性进一步得到student_detail_1.json中的更多属性)。 
                    student.json代码如下 : 

    1. {
    2. "id" : 1,
    3. "name" : "Cyan"
    4. }

                    student_detail_1.json代码如下 : 

    1. {
    2. "id" : 1,
    3. "name" : "Cyan",
    4. "age" : 21,
    5. "score" : 450
    6. }

                1.2 JQuery操作Ajax

                    traditional_ajax.html代码如下 : 

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Traditional Asynchronoustitle>
    6. <script type="text/javascript" src="../script/jquery-3.7.0.min.js">script>
    7. <script type="text/javascript">
    8. /*
    9. PS : JQuery操作Ajax回顾 :
    10. $.ajax函数的常用参数如下———
    11. (1) url : 请求的地址
    12. (2) type : 请求的方式GET or POST
    13. (3) data : 发送到服务器端的数据,将自动转换为请求字符串格式
    14. (4) success : 成功的回调函数
    15. (5) dataType : 返回的数据类型,常用Json或text。
    16. */
    17. $.ajax({
    18. url:"../data/student.json",
    19. // type: ,
    20. // data: ,
    21. success:function (resultData) {
    22. console.log("The 1st request,and the student's basic information is :",resultData);
    23. //从第二次异步请求开始,已经出现了"ajax嵌套"
    24. $.ajax({
    25. url:`../data/student_detail_${resultData.id}.json`,
    26. success(resultData) {
    27. console.log("The 2nd request,and the student's detailed information is :",resultData)
    28. },
    29. error(errInfo) {
    30. console.log("Oh oh,Something bad happened:",errInfo);
    31. }
    32. })
    33. },
    34. error(errInfo) { //ES6新特性————对象的方法简写。
    35. console.log("Something bad happened:",errInfo);
    36. }
    37. })
    38. script>
    39. head>
    40. <body>
    41. body>
    42. html>

                    运行结果 : 

            2.使用ES6新特性Promise方式 : 

                    数据部分仍然使用data包下的student.json和student_detail_1.json。
                    promise.html代码如下 : 

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Promise Demonstrationtitle>
    6. <script type="text/javascript" src="../script/jquery-3.7.0.min.js">script>
    7. <script type="text/javascript">
    8. //1.首先请求data包下的student.json(需要创建一个Promise对象)
    9. //创建Promise对象时需要传入一个箭头函数
    10. //形参resolve表示请求成功的回调函数;形参reject表示请求失败的回调函数。
    11. //形参resolve和reject是约定俗成的,不固定,可以自由更改名称。
    12. let promise = new Promise((resolve,reject) => {
    13. //发出Ajax异步请求
    14. $.ajax({
    15. url:"../data/student.json",
    16. // type:
    17. // data:
    18. // dataType:
    19. success(resultData) {
    20. console.log("Promise's 1st request,and the student's basic information is :",resultData);
    21. //该方法将resultData参数传递到then()
    22. resolve(resultData);
    23. },
    24. error(errInfo) {
    25. // console.log("Promise's 1st request---Perhaps sth bad happened:",errInfo);
    26. //使用ES6---Promise提供的catch机制来统一处理异常
    27. reject(errInfo);
    28. }
    29. })
    30. })
    31. //2.第二次请求在这里执行!
    32. promise.then(resultData => { //箭头函数形参的简写
    33. // 调用链, 通过return将Promise对象返回给下一个调用者。
    34. return new Promise((resolve, reject) => {
    35. $.ajax({
    36. //url采用了模板字符串的形式
    37. url:`../data/student_detail_${resultData.id}.json`,
    38. success(resultData) {
    39. console.log("Promise's 2nd request,and the student's detailed information is :",resultData);
    40. /*
    41. 可以在第二次请求的success回调函数里,
    42. 继续使用resolve(resultData);发出第三次请求。
    43. */
    44. resolve(resultData);
    45. },
    46. error(errInfo) {
    47. // console.log("Promise's 2nd request---Perhaps sth bad happened:",errInfo);
    48. reject(errInfo);
    49. }
    50. })
    51. })
    52. }).then(resultData => {
    53. /*
    54. (1)此处输出的resultData,来自第二次Ajax请求的success中的"resolve(resultData);"
    55. (2)可以在这个then方法中,继续通过
    56. "return new Promise((resolve, reject) => { $.ajax({}) })"
    57. 的方式来发出第三次Ajax异步请求。
    58. (3)第三次Ajax异步请求,是基于第二次Ajax请求获取的数据resultData。
    59. */
    60. console.log("After 2nd request, THE resultData =",resultData);
    61. }).catch(errInfo => {
    62. console.log("U~ Promise's request---Perhaps sth bad happened:",errInfo);
    63. })
    64. script>
    65. head>
    66. <body>
    67. body>
    68. html>

                    运行结果 :


    三、Promise代码重排优化

            1.问题分析 : 

            使用Primise方式代替传统Ajax方式发送多次异步请求之后,以“链式调用”代替了“嵌套调用”,可读性提升。

            但仍然存在“代码臃肿”,“代码重复度高”的特点;因此,可以通过代码重排进行优化

            2.代码优化 : 

                2.1 数据准备

                    在data包下新建一个json文件,用来模拟student1的监护人的数据。
                    custodian_1.json代码如下 : 

    1. {
    2. "id" : 1,
    3. "phonetic" : "/kʌˈstoʊdiən/",
    4. "father": "f1",
    5. "mother": "m1",
    6. "telephone": 5204505
    7. }

                2.2 代码重排

                    promise_EX.html代码如下 : 

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>To Optimize Promisetitle>
    6. <script type="text/javascript" src="../script/jquery-3.7.0.min.js">script>
    7. <script type="text/javascript">
    8. /**
    9. * @function 将多次请求相似的代码封装到一个方法中
    10. * @param url : 请求的资源
    11. * @param data : 请求时携带的数据
    12. * @returns {Promise}
    13. */
    14. function getRequest(url, data) {
    15. return new Promise((resolve, reject) => {
    16. $.ajax({
    17. url:url,
    18. data:data,
    19. success(resultData) {
    20. resolve(resultData);
    21. },
    22. error(err) {
    23. reject(err);
    24. }
    25. })
    26. })
    27. }
    28. //1.第一次请求 --- 得到student.json中保存的数据
    29. getRequest("../data/student.json").then(resultData => {
    30. console.log("student =", resultData);
    31. //2.第二次请求 --- 得到student_detail_1.json中保存的数据
    32. return getRequest(`../data/student_detail_${resultData.id}.json`).then(resultData => {
    33. console.log("student_1 =", resultData);
    34. //3.第三次请求 --- 得到custodian_1.json中保存的数据
    35. return getRequest(`../data/custodian_${resultData.id}.json`).then(resultData => {
    36. console.log("custodian_1 =",resultData);
    37. })
    38. })
    39. }).catch(err => {
    40. console.log("Perhaps something bad happened:",err);
    41. })
    42. script>
    43. head>
    44. <body>
    45. body>
    46. html>

                    运行结果 : 

            System.out.println("END------------------------------------------------------------");

  • 相关阅读:
    C语言 IO函数练习
    笔记 | 编程经验谈:如何正确的使用内存
    文件结构介绍
    el-select的el-option添加操作按钮插槽后实现勾选与按钮操作分离
    C++学习(四八七)android studio println的输出位置
    FANUC机器人实现本地自动运行的相关配置和参数设置
    大语言模型在天猫AI导购助理项目的实践!
    企业级npm仓库搭建
    golang channel执行原理与代码分析
    win10 & win11 停止系统自动更新方法
  • 原文地址:https://blog.csdn.net/TYRA9/article/details/133912776