Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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_Jquery Deferred - Fatal编程技术网

Javascript 在另一个ajax函数结束后执行操作

Javascript 在另一个ajax函数结束后执行操作,javascript,jquery,ajax,jquery-deferred,Javascript,Jquery,Ajax,Jquery Deferred,我正在为此寻找解决方案: 我有一个更新应用程序中表内容的函数 function prev_update(cli_id){ $("#list").empty(); $("#list").append("<tr><td colspan=11><img src='images/loading.gif' alt=loading title=loading /></td></tr>"); $.ajax({

我正在为此寻找解决方案: 我有一个更新应用程序中表内容的函数

function prev_update(cli_id){
    $("#list").empty();
    $("#list").append("<tr><td colspan=11><img src='images/loading.gif' alt=loading title=loading /></td></tr>");
    $.ajax({
        type        : 'POST',
        url         : 'json/get.php?t=2&id='+cli_id, 
        dataType    : 'json',
        encode      : true
    })
    .done(function(data) {
        $("#list").empty();
        if ((data)["prev_list"]) {  
            $.each((data)["prev_list"], function( i, val ) {
                $( "#list" ).append(val);
            });
            $("#edit").hide("slow");
        } else {
            $("#list").append("<tr><td colspan=11>&nbsp;</td></tr>");                       
        }
    });
};
我必须等待prev_update()函数结束,然后单击该按钮,因为该按钮位于正在更新的表中。 我也尝试使用延迟对象,但它不起作用(可能是因为我的错误)。
我无法编辑函数prev\u update,因为它被其他函数使用。

而不是
。完成
您可以使用
。然后
组织代码。这是因为
。然后可以链接

没有经过测试,但可以是这样

function prev_update(cli_id){
    $("#list").empty();
    $("#list").append("<tr><td colspan=11><img src='images/loading.gif' alt=loading title=loading /></td></tr>");
    $.ajax({
        type        : 'POST',
        url         : 'json/get.php?t=2&id='+cli_id, 
        dataType    : 'json',
        encode      : true
    })
    .then(function(data) {
        $("#list").empty();
        // rest of code
    }).then(function(data) {
        if ((data)["success"]===false) {    
            // rest of code
        };
   });
function prev\u update(cli\u id){
$(“#列表”).empty();
$(“#列表”)。追加(“”);
$.ajax({
键入:“POST”,
url:'json/get.php?t=2&id='+cli_id,
数据类型:“json”,
编码:正确
})
.then(功能(数据){
$(“#列表”).empty();
//代码的其余部分
}).then(功能(数据){
如果((数据)[“成功”]==false){
//代码的其余部分
};
});

而不是
。完成
您可以使用
。然后
来组织代码。这是因为
。然后
可以链接

没有经过测试,但可以是这样

function prev_update(cli_id){
    $("#list").empty();
    $("#list").append("<tr><td colspan=11><img src='images/loading.gif' alt=loading title=loading /></td></tr>");
    $.ajax({
        type        : 'POST',
        url         : 'json/get.php?t=2&id='+cli_id, 
        dataType    : 'json',
        encode      : true
    })
    .then(function(data) {
        $("#list").empty();
        // rest of code
    }).then(function(data) {
        if ((data)["success"]===false) {    
            // rest of code
        };
   });
function prev\u update(cli\u id){
$(“#列表”).empty();
$(“#列表”)。追加(“”);
$.ajax({
键入:“POST”,
url:'json/get.php?t=2&id='+cli_id,
数据类型:“json”,
编码:正确
})
.then(功能(数据){
$(“#列表”).empty();
//代码的其余部分
}).then(功能(数据){
如果((数据)[“成功”]==false){
//代码的其余部分
};
});

如果您想知道
prev_update()
中的所有内容何时完成,则必须对其进行修改以跟踪其中的异步操作并返回一个承诺。然后,调用方可以使用返回的承诺来知道事情何时完成

因此,在
prev_update()
内部,两个异步操作是ajax调用和
.hide()
动画。隐藏动画发生在ajax操作的完成处理程序内部。因此,如果将
.done()
更改为
,则()
,我们可以将这些承诺链接在一起,并返回一个承诺,该承诺将在所有事情完成时告知调用方

jQuery有一个
.promise()
方法,该方法将为我们获得一个链接到任何jQuery动画的承诺,因此如果我们只获得动画的承诺,我们可以返回它,它将链接到父承诺。如果没有动画,那么我们可以不返回任何内容,承诺链将继续

这根本不会改变
prev_update()
的功能-它只返回一个跟踪其完成情况的承诺(当您以前没有返回任何内容时)

可以这样工作:

function prev_update(cli_id){
    $("#list").empty();
    $("#list").append("<tr><td colspan=11><img src='images/loading.gif' alt=loading title=loading /></td></tr>");
    return $.ajax({
        type        : 'POST',
        url         : 'json/get.php?t=2&id='+cli_id, 
        dataType    : 'json',
        encode      : true
    }).then(function(data) {
        var p;
        $("#list").empty();
        if ((data)["prev_list"]) {  
            $.each((data)["prev_list"], function( i, val ) {
                $( "#list" ).append(val);
            });
            p = $("#edit").hide("slow").promise();
        } else {
            $("#list").append("<tr><td colspan=11>&nbsp;</td></tr>");                       
        }
        // return promise if there was one
        return p;
    });
};
$("#prev_mod").on("click",(function( event ) {
     $('#loading_img').css('display','inline');
     header_print();
     $.ajax({
         type       : 'POST',
         url        : 'json/post.php?mod='+$('#prev_id').val(),
         data       : $("#form_sog").serialize(),
         dataType   : 'json',
         encode : true
   }).then(function(data) {
        if ((data)["success"]===false) {    
            $('#form_edit').hide('slow');
            prev_update().then(function() {
                // apply click when everything in prev_update() is done
                $('#edit_'+$('#prev_id').val()).click();
            });
        });
   });
}));

如果您想知道
prev_update()
中的所有内容何时完成,则必须对其进行修改,以跟踪其中的异步操作并返回一个承诺。然后,调用方可以使用返回的承诺来知道事情何时完成

因此,在
prev_update()
内部,两个异步操作是ajax调用和
.hide()
动画。隐藏动画发生在ajax操作的完成处理程序内部。因此,如果将
.done()
更改为
,则()
,我们可以将这些承诺链接在一起,并返回一个承诺,该承诺将在所有事情完成时告知调用方

jQuery有一个
.promise()
方法,该方法将为我们获得一个链接到任何jQuery动画的承诺,因此如果我们只获得动画的承诺,我们可以返回它,它将链接到父承诺。如果没有动画,那么我们可以不返回任何内容,承诺链将继续

这根本不会改变
prev_update()
的功能-它只返回一个跟踪其完成情况的承诺(当您以前没有返回任何内容时)

可以这样工作:

function prev_update(cli_id){
    $("#list").empty();
    $("#list").append("<tr><td colspan=11><img src='images/loading.gif' alt=loading title=loading /></td></tr>");
    return $.ajax({
        type        : 'POST',
        url         : 'json/get.php?t=2&id='+cli_id, 
        dataType    : 'json',
        encode      : true
    }).then(function(data) {
        var p;
        $("#list").empty();
        if ((data)["prev_list"]) {  
            $.each((data)["prev_list"], function( i, val ) {
                $( "#list" ).append(val);
            });
            p = $("#edit").hide("slow").promise();
        } else {
            $("#list").append("<tr><td colspan=11>&nbsp;</td></tr>");                       
        }
        // return promise if there was one
        return p;
    });
};
$("#prev_mod").on("click",(function( event ) {
     $('#loading_img').css('display','inline');
     header_print();
     $.ajax({
         type       : 'POST',
         url        : 'json/post.php?mod='+$('#prev_id').val(),
         data       : $("#form_sog").serialize(),
         dataType   : 'json',
         encode : true
   }).then(function(data) {
        if ((data)["success"]===false) {    
            $('#form_edit').hide('slow');
            prev_update().then(function() {
                // apply click when everything in prev_update() is done
                $('#edit_'+$('#prev_id').val()).click();
            });
        });
   });
}));

数据
不会传递到第二个链式
。然后()
处理程序,除非您从上一个处理程序返回它。@jfriend00没错,我还觉得这可能会导致第二个
中的执行永远不会结束。然后,
又有一个对
prev\u update
的引用,它将导致第一个的执行。
然后,
等等其他函数可以使用prev\u updateons,因此我无法修改prev_update函数,但我必须使用另一个函数。如果我的问题不清楚,很抱歉…
数据将不会传递到第二个链接
。然后()
处理程序,除非您从上一个处理程序返回它。@jfriend00没错,我还觉得这可能会导致第二个
中的执行永远不会结束。然后,
又有一个对
prev\u update
的引用,它将导致第一个的执行。
然后,
等等其他函数可以使用prev\u updateons,所以我不能修改prev_update函数,但我必须使用另一个函数。如果我的问题不清楚,很抱歉…当你说“prev_update()函数结束”,你的确切意思是什么?你是说所有的动画都完成了,还是说它只是运行并完成了它开始做的事情?还有,你怎么不在这里结束一个无限循环,因为
prev_update()
无休止地调用自身。我发布的第二个代码来自另一个函数。当我说函数结束时,我的意思是当你说“prev_update()函数结束”时,函数已经完成了它启动的所有过程(ajax请求和其他动画),你的确切意思是什么?你是说所有的动画都完成了,还是说它只是运行并完成了它开始做的事情?还有,既然
prev_update()
不断地调用自己,你怎么不以无限循环结束呢。我发布的第二个代码来自另一个