• Promise实例.then()链式调用,中段Promise链,Promise错误穿透.catch()


     Promise实例.then()返回的是一个【新的Promise实例】,它的值和状态由什么决定?

    1.简单表达:由then()所指定的回调函数执行的结果决定

    2.详细表达:

    (1)如果then所指定的回调返回的是非Promise值a:

        那么【新Promise实例】状态为:成功(fulfilled)成功的value为a

    (2)如果then所指定的回调返回的是Promise值p:

        那么【新Promise实例】状态\值,都与p一致

        (2)如果then所指定的回调抛除异常:

        那么【新Promise实例】状态为rejected,reason为抛除的那个异常

        中段Promise链:

        (1)当使用promise的then链式调用时,在中间中断,不在调用后面的回调函数

        (2)办法:在失败的回调函数中返回一个pendding状态的Promise实例

    1. <script>
    2.    function sentAjax(url,data){
    3.     return(
    4.         new Promise((resolve,reject)=>{
    5.             // resolve(1)
    6.             let xhr = new XMLHttpRequest()
    7.             xhr.onreadystatechange =()=>{
    8.                 if(xhr.readyState === 4){
    9.                     if(xhr.status >= 200 && xhr.status<300){
    10.                         resolve(xhr.response)
    11.                     }else{
    12.                         reject('出错了')
    13.                     }
    14.                 }
    15.             }
    16.             // 整理url中的参数
    17.             let str=''
    18.             for(key in data){
    19.                 str += `${key}=${data[key]}`
    20.             }
    21.             xhr.open('GET',url+'?'+ str)
    22.             xhr.responseType="json"
    23.             xhr.send()
    24.         })
    25.     )
    26.    }
    27.    sentAjax('https://api.github.com/search/users',{q:2})
    28.    .then(
    29.         value=>{
    30.             console.log('第一次成功了',value)
    31.             return sentAjax('https://api.github.com/search/users',{q:3})
    32.         },
    33.         reason=>{
    34.             console.log('第一次失败了',reason)
    35.             return new Promise(()=>{})
    36.         }
    37.         )
    38.     .then(
    39.         value=>{
    40.             console.log('第二次成功了',value)
    41.             return sentAjax('https://api.github.com/search/users',{q:4})
    42.         },
    43.         reason=>{
    44.             console.log(reason)
    45.             return new Promise(()=>{})
    46.         }
    47.         )
    48.     .then(
    49.         value=>{console.log('第三次成功了',value)},
    50.         reason=>{console.log(reason)}
    51.         )
    52. </script>

    可惜,幸福都类似,悲伤却又千万种

        Promise错误穿透:

        (1)当使用promise的then链式调用时,可以在最后用catch指定一个失败的回调

        (2)当前任何操作出错,都会传到左后失败的回调中处理

        备注:如果不存在then的链式调用,就不需要考虑then的错误穿透

    1. <script>
    2. function sentAjax(url,data){
    3. return(
    4. new Promise((resolve,reject)=>{
    5. // resolve(1)
    6. let xhr = new XMLHttpRequest()
    7. xhr.onreadystatechange =()=>{
    8. if(xhr.readyState === 4){
    9. if(xhr.status >= 200 && xhr.status<300){
    10. resolve(xhr.response)
    11. }else{
    12. reject('出错了')
    13. }
    14. }
    15. }
    16. // 整理url中的参数
    17. let str=''
    18. for(key in data){
    19. str += `${key}=${data[key]}`
    20. }
    21. xhr.open('GET',url+'?'+ str)
    22. xhr.responseType="json"
    23. xhr.send()
    24. })
    25. )
    26. }
    27. sentAjax('https://api.github.com/search/users4',{q:2})
    28. .then(
    29. value=>{
    30. console.log('第一次成功了',value)
    31. return sentAjax('https://api.github.com/search/users',{q:3})
    32. },
    33. // reason=>{throw reason} //底层默认填补
    34. )
    35. .then(
    36. value=>{
    37. console.log('第二次成功了',value)
    38. return sentAjax('https://api.github.com/search/users',{q:4})
    39. },
    40. // reason=>{throw reason}
    41. )
    42. .then(
    43. value=>{console.log('第三次成功了',value)},
    44. // reason=>{throw reason}
    45. )
    46. .catch(
    47. reason=>{console.log(reason)}
    48. )
    49. </script>

    Promise中 异步async(高冷女)和 等待 await(舔狗)_Allen 赵奇隆的博客-CSDN博客

  • 相关阅读:
    Python基础(一):基本概念
    LeetCode简单题之回环句
    【Java】图形、图像与音频(实验十二)
    Stack Overflow 2022 开发者调查:行业走向何方?
    通过PWM实现呼吸灯
    【第十四篇】- Maven 自动化构建
    Linux文件操作系统接口的学习使用
    关于订单功能的处理和分析
    【高项】- 范围管理论文
    【Python入门】元组与字符串
  • 原文地址:https://blog.csdn.net/zqlbanzhuan/article/details/128117410