现在页面有三个table。需要通过ajax,给每个tr加上内容。原先是ajax全部异步执行,然后出结果。现在需要先等第一个table的内容全部出来再去执行第二个的,第二个的结束了再去执行第三个的。这样的应该怎么写?我原先的写法如下:
$('.table_one_tr').each(function(i,n) {
$.ajax({
type : "GET",
url : link,
dataType : "json",
success:function(data) {
},
error:function (data){
}
});
});
$('.table_two_tr').each(function(i,n) {
$.ajax({
type : "GET",
url : link,
dataType : "json",
success:function(data) {
},
error:function (data){
}
});
});
$('.table_three_tr').each(function(i,n) {
$.ajax({
type : "GET",
url : link,
dataType : "json",
success:function(data) {
},
error:function (data){
}
});
});
要按顺序执行异步,比较简单的写法是使用
await
。关于await
,可以参阅:理解 JavaScript 的 async/await。jQuery.ajax 的结果虽然不是 Promise,但是 Promise Like,同样可以对其使用
await
来异步等待。只不过不能通过.catch()
来处理错误,用.fail()
来处理错误也不能避免抛出异常,所以必须用try ... catch
来自处理错误。$('.table_one_tr').each(fn)
,这是每有一个.table_one_tr
就会执行一次fn
,理论上应该是很多个啊。虽然为了完成一个业务 要做这么多次 Ajax 不太合理。但如果确实需要,这里如果要一个个执行的话,就不能用.each()
,要转成 Array 直接用for ... of
如果这里需要并发,用
.each()
是可以,但是不知道什么时候所有并发完成,所以还是需要收集成一个 promise list,再用Promise.all()
或者Promise.allSettled()
来运行:一个处理了,等待结束之后再处理另一个就容易了