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> </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> </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> </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()
不断地调用自己,你怎么不以无限循环结束呢。我发布的第二个代码来自另一个