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

6 篇文章 0 订阅

 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实例

<script>

   function sentAjax(url,data){

    return(

        new Promise((resolve,reject)=>{

            // resolve(1)

            let xhr = new XMLHttpRequest()

            xhr.onreadystatechange =()=>{

                if(xhr.readyState === 4){

                    if(xhr.status >= 200 && xhr.status<300){

                        resolve(xhr.response)

                    }else{

                        reject('出错了')

                    }

                }

            }

            // 整理url中的参数

            let str=''

            for(key in data){

                str += `${key}=${data[key]}`

            }

            xhr.open('GET',url+'?'+ str)

            xhr.responseType="json"

            xhr.send()

        })

    )

   }

   sentAjax('https://api.github.com/search/users',{q:2})

   .then(

        value=>{

            console.log('第一次成功了',value)

            return sentAjax('https://api.github.com/search/users',{q:3})

        },

        reason=>{

            console.log('第一次失败了',reason)

            return new Promise(()=>{})

        }

        )

    .then(

        value=>{

            console.log('第二次成功了',value)

            return sentAjax('https://api.github.com/search/users',{q:4})

        },

        reason=>{

            console.log(reason)

            return new Promise(()=>{})

        }

        )

    .then(

        value=>{console.log('第三次成功了',value)},

        reason=>{console.log(reason)}

        )

</script>

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

    Promise错误穿透:

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

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

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

<script>
   function sentAjax(url,data){
    return(
        new Promise((resolve,reject)=>{
            // resolve(1)
            let xhr = new XMLHttpRequest()
            xhr.onreadystatechange =()=>{
                if(xhr.readyState === 4){
                    if(xhr.status >= 200 && xhr.status<300){
                        resolve(xhr.response)
                    }else{
                        reject('出错了')
                    }
                }
            }
            // 整理url中的参数
            let str='' 
            for(key in data){
                str += `${key}=${data[key]}`
            }
            xhr.open('GET',url+'?'+ str)
            xhr.responseType="json"
            xhr.send()
        })
    )
   }
   sentAjax('https://api.github.com/search/users4',{q:2})
   .then(
        value=>{
            console.log('第一次成功了',value)
            return sentAjax('https://api.github.com/search/users',{q:3})
        },
        // reason=>{throw reason} //底层默认填补
        )
    .then(
        value=>{
            console.log('第二次成功了',value)
            return sentAjax('https://api.github.com/search/users',{q:4})
        },
        // reason=>{throw reason}
        )
    .then(
        value=>{console.log('第三次成功了',value)},
        // reason=>{throw reason}
        )
    .catch(
        reason=>{console.log(reason)}
    )
</script>

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值