多个ajax嵌套的解决方案,拒绝异步的回调地狱

场景:先Ajax访问第1个,在第1个访问完成后,用拿到的返回数据作为参数再访问第2个,第2个访问完成后再第3个...

代码:

/* 第一个ajax请求,返回的是promise对象 */
var promise1 = $.ajax({url:'url1'});
/* 注册promise1的done和fail回调函数 */
var promise2 = promise1.then(function(data){
    console.log(1,data)
    if (!data.status) {
        /* 如果第一个ajax结果失败,例如错误原因为缺少参数,将结果return */
        return data;
    }else{
        /* 如果第一个ajax请求成功,返回第二个ajax的promise对象 */
        return $.ajax({url:'url2','data':data});
    }
    
},function (data) {
    /* ajax请求失败 */
    console.log('fail1',data)
    return data;
});
/* 注册promise2的done和fail回调函数 */
var promise3 = promise2.then(function(data){
    console.log(2,data)
    if (!data.status) {
        /* 如果第二个ajax结果失败,例如错误原因为参数格式不正确,将结果return */
        return data;
    }else{
        /* 如果第二个ajax请求成功,返回第三个ajax的promise对象 */
        return $.ajax({url:'url3','data':data});
    }
},function (data) {
    console.log('fail2',data)
});
promise3.done(function(data){
    
    console.log(3,data)
    if (!data.status) {
        /* 
    在上面的done函数中,都是将错误的结果返回,此处能拿到上两次发成错误的原因:缺少参数/参数格式不正确,或者是第三个ajax的错误原因 */
        console.log('链式操作失败')
    }else{
        /* 到此处,说明上面的三个ajax都发送成功 */
        console.log('链式操作成功')
    }
    // data retrieved from url3
}).fail(function (data) {
    console.log('fail3',data)
    console.log('链式操作失败')
})

注意:

1、then()注册回调函数,会将第一回调函数的返回值将作为第二个回调函数的参数

2、多个promise链式操作,下个promise的回调会延续上个promise的回调。例如第一个promise对象调用done回调,第二个也会继续调用done回调,如果第三个调用的是fail回调则后面的都会使用done回调

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值