Asynchronous jquery - ajax when().then();

Asynchronous jquery - ajax when().then();

本文关键字:then when jquery ajax Asynchronous      更新时间:2023-09-26

我一直在努力阅读文档,但我很难理解一些概念:

$.when(function(){
    $.ajax({url:'php/Mostrarphp.php', type:'post',data: {queHacer:"MostrarUsuarios"}})
    .then(function(success) {
        $("#main").html(success);
    },function(error) {
        $("#main").html(error);
    });
})
.then(function() {
    console.log("test");
});

我要做的是让第一个函数进入PHP文件,在该文件中只有一个包含到另一个文件。之后,我想要显示控制台日志。(这只是练习,当我需要运行检索数据的函数,将花费更长的时间)。

这里的问题是echo没有显示在应用程序上,只显示在然后(console.log("test"))上解决的内容。

让这个执行内部函数然后执行第二个函数的正确方法是什么?

当您使用$.when时,您正在创建一个新的承诺,一个需要解决的承诺。通常,$.when用于将多个承诺"组合"为一个,然后在所有解决后运行一个函数。

你传递给$.when的只是一个函数。一个永远不会运行的函数。来自文档:

如果一个参数被传递给jQuery.when(),并且它不是Deferred或Promise,它将被视为已解决的Deferred,并且任何附加的doneCallbacks将立即执行。

所以,这意味着你的console.log("test");运行,但你的AJAX代码从来没有运行。

你不必在这里不使用$.when$.ajax 已经返回承诺,没有必要再做一个。链接 .then()调用。

$.ajax({
    url:'php/Mostrarphp.php',
    type:'post',
    data: {queHacer:"MostrarUsuarios"}
}).then(function(success){
    $("#main").html(success);
},function(error){
    $("#main").html(error);
}).then(function(){
    console.log("test");
});

编辑:在评论中你说:

[无论]内部执行需要多少时间才能完成,外部[应该]总是执行第二个

如果这是你想要的,那么你需要创建另一个承诺。您可以这样做,然后在"内部"函数完成后进行解析。我建议将AJAX代码包装在一个函数中,并让它返回一个可以附加回调的承诺。

function ajaxCall(){
    var d = new $.Deferred;
    $.ajax({
        url:'php/Mostrarphp.php',
        type:'post',
        data: {queHacer:"MostrarUsuarios"}
    }).then(function(success){
        setTimeout(function(){
            $("#main").html(success);
            d.resolve();
        }, 2000);
    },function(error){
        $("#main").html(error);
        d.reject();
    });
    return d.promise();
}
ajaxCall().then(function(){
    console.log("test");
});