Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何等待多个ajax请求完成?_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 如何等待多个ajax请求完成?

Javascript 如何等待多个ajax请求完成?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一些异步ajax请求 $.ajax({ url: 'first.php', async: true, success: function (data) { //do stuff } }); $.ajax({ url: 'second.php', async: true, success: function (data) { //do stuff } }); ... $.ajax({

我有一些
异步ajax请求

$.ajax({
    url: 'first.php',
    async: true,
    success: function (data) {
        //do stuff
    }
});

$.ajax({
    url: 'second.php',
    async: true,
    success: function (data) {
        //do stuff
    }
});

...

$.ajax({
    url: 'nth.php',
    async: true,
    success: function (data) {
        //do stuff
    }
});
我想在每个请求完成后运行
console.log()

我通常编写以下代码:

$.ajax({
    url: 'first.php',
    async: true,
    success: function (data) {
        $.ajax({
            url: 'second.php',
            async: true,
            success: function (data) {
                //till the last ajax
            }
        });
    }
});
然而,有人建议
承诺。所有([])

如果我必须运行4个ajax请求,哪种方法最好/最快?

使用
Promise.all()

var承诺=[];
承诺。推送(新承诺(完成=>{
$.ajax({
url:'first.php',
async:true,
成功:完成
});
}));
承诺。推送(新承诺(完成=>{
$.ajax({
url:'second.php',
async:true,
成功:完成
});
}));
承诺。推送(新承诺(完成=>{
$.ajax({
url:'nth.php',
async:true,
成功:完成
});
}));
承诺。所有(承诺)。然后(()=>{
log(“所有ajax已完成”);
});官方声明:

从jQuery 1.5开始,$.ajax()返回的jqXHR对象实现Promise接口,为它们提供Promise的所有属性、方法和行为(有关更多信息,请参阅Deferred object)

:

提供一种基于零个或多个表对象(通常是表示异步事件的延迟对象)执行回调函数的方法

因此,您可以执行以下操作:

jQuery.when(
    $.ajax({
        url: 'first.php',
        async: true,
        success: function (data) {
            //do stuff
        }
    }),

    $.ajax({
        url: 'second.php',
        async: true,
        success: function (data) {
            //do stuff
        }
    }),

    ...,

    $.ajax({
        url: 'nth.php',
        async: true,
        success: function (data) {
            //do stuff
        }
    })
).then(function() {console.log(...);});

$。when()
承诺。all()
这是否回答了您的问题@sandrooco Mh,我没有任何循环,但是你建议我的答案是关于
Promise.all([])
。那么
when()
呢?@Vinserello jQuery的
$。when()
早在
承诺之前就存在了。all()
成为标准。几年来,
$.ajax
与本机承诺完全兼容,因此与
承诺.all()
完全兼容。令人惊讶的是,您确认了
承诺.all()
,但是,
何时()
有什么区别?我从未考虑过
何时()
。也许它更倾向于
Promise.all([])。然后()
$。when()
是jQuery替代“香草”
Promise.all()
。除了一些语法上的差异外,它们做的事情基本相同。我提出了jQuery版本,因为您已经在使用jQuery处理ajax请求(一致性)。有趣的是,
$.when()
大约在
Promise.all()
首次在浏览器中本机实现之前3年就已经可用了。