为什么要用promise处理ajax,用promise.all解决ajax异步循环请求问题

Promise.all() 并不能解决循环的问题,一般情况下 .all() 的参数是 Promise 数组(暂时不考虑其它类似)。那么,数组中的每个 Promise 都代表着一个异步操作,Promise.all() 的作用是等待这些异步操作全部执行完成,所以实质上并不是 Promise.all() 是并发的,而是 Promise.all() 等待着一堆并发执行完成。

因此,Promise.all() 并不能解决有序循环。作为特例,如果 Promise.all() 等待的全都是同步代码,比如题主示例中虽然用了 .map(),映射结果却并不是 Promise 对象,而是同步执行(直接返回的 id),这种情况下,实际是依次执行的完了再把结果放入 .all() 的,所以是同步顺序循环处理的(就是 map 干的事情)。题主的第一段代码,如果变量名不是 promises,你觉得它跟异步或者 Promise 有任何关系吗?

然后当然要指出 ajax 调用时候的一个失误:{} 中的内容应该是 ajax 的参数,所以应该放在括号中 ({...}) 才对。

由于 promises 变量保存的只是一个同步运行的结果集,所以 Promise.all(promises) 其实就是对 then() 的回调直接传递的这个结果集,所以 val 的值实际就是 [1, 2]。因此下面这个写法是没有问题的

$.ajax({

data: val

});

问题在于下面这里

Promise.all(promises)

.then(function(val) {

// 问题在把 ajax 放入 then 回调中之后

$.ajax({

data: val

});

})

.catch(function(err) {

// ....

});

这里如果 ajax 发生错误,它不会抛异常,而是等待它自己的 .fail() 处理,因为没有定义,所以就被丢弃了。它并不会传递到后面的 .catch() 中,要解决这个问题,可以是得用 ajax 自己的 .fail() 来处理错误

Promise.all(promises)

.then(function(val) {

// 问题在把 ajax 放入 then 回调中之后

$.ajax({ data: val })

.fail(function(err) {

// 这里处理错误逻辑

});

});

也可以是,直接将 ajax 的结果(thenable)传递下去,由 Promise 机制的 .catch() 来处理

Promise.all(promises)

.then(function(val) {

// 问题在把 ajax 放入 then 回调中之后

return $.ajax({ data: val });

})

.catch(function(err) {

// 处理错误逻辑

});

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值