Javascript 为什么我的'then'事件在我的'when'事件完成之前触发?
我的页面上有一个预览帖子列表。当他们被点击时,他们应该加载文章的全文,加载评论,然后向下滑动以显示两者 我有一个函数partialSlide,它模拟向下滑动,但从指定的高度开始-它是从。另外两个函数loadFullPost和loadComments是我的 所有事件都会触发,但partialSlide会在loadComments完成之前触发,因此在计算高度时没有考虑到它们,因此它们会被切断 当我将它们设置为when>then格式时,为什么会发生这种情况Javascript 为什么我的'then'事件在我的'when'事件完成之前触发?,javascript,jquery,promise,.when,Javascript,Jquery,Promise,.when,我的页面上有一个预览帖子列表。当他们被点击时,他们应该加载文章的全文,加载评论,然后向下滑动以显示两者 我有一个函数partialSlide,它模拟向下滑动,但从指定的高度开始-它是从。另外两个函数loadFullPost和loadComments是我的 所有事件都会触发,但partialSlide会在loadComments完成之前触发,因此在计算高度时没有考虑到它们,因此它们会被切断 当我将它们设置为when>then格式时,为什么会发生这种情况 $.when(loadComments(di
$.when(loadComments(divID,postID)).done(partialSlide(divID));
我是否误解了承诺在jQuery中的作用?在我的代码中的其他地方,它们已经按预期工作了(当完成时,只运行一次)
全部功能如下:
function loadFullPost(permalink,divID,postID) {
$.when($.when($.ajax({url: permalink+"?ajax=true", success:
function(result){$("#"+divID+"").html(result);}})).then
(function( data, textStatus, jqXHR ) {
$.when(loadComments(divID,postID)).done(partialSlide(divID));
}));
}
function loadComments(divID,postID) {
$.ajax({url: "ajax-comments/?post_id=" + postID, success:
function(result){
$("#" + divID + " .comment.list").html(result);
}});
}
function partialSlide(divID) {
var contentHeight = $("#"+divID+"").addClass('full').height();
$("#"+divID+"").removeClass('full').animate({
height: (contentHeight == $("#"+divID+"").height() ? 100 : contentHeight)
}, 500);
}
我想你的问题可能是loadComments没有回报,所以承诺永远不会给when
function loadComments(divID,postID) {
return $.ajax({url: "ajax-comments/?post_id=" + postID, success:
function(result){
$("#" + divID + " .comment.list").html(result);
}});
}
正如注释中指出的,这一行立即调用partialSlide,因为末尾有括号。应该是:
$.when(loadComments(divID,postID)).done(function () { partialSlide(divID) });
我想你的问题可能是loadComments没有回报,所以承诺永远不会给when
function loadComments(divID,postID) {
return $.ajax({url: "ajax-comments/?post_id=" + postID, success:
function(result){
$("#" + divID + " .comment.list").html(result);
}});
}
正如注释中指出的,这一行立即调用partialSlide,因为末尾有括号。应该是:
$.when(loadComments(divID,postID)).done(function () { partialSlide(divID) });
正如已经解释过的注释,代码中存在多个问题,如
$.ajax()
返回承诺对象,因此无需将其传递给$.when()
由于您希望在loadComments
中的ajax请求完成后做一些事情,因此需要从中返回一个承诺。因为$.ajax
返回一个承诺,所以您可以只返回该值
您需要将函数引用传递给done()
,当执行partialSlide(divID)
时,您实际上是通过传递参数调用函数partialSlide
,并将从该函数返回的值(undefined
在本例中)作为done回调传递
所以
正如已经解释过的注释,代码中存在多个问题,如
$.ajax()
返回承诺对象,因此无需将其传递给$.when()
由于您希望在loadComments
中的ajax请求完成后做一些事情,因此需要从中返回一个承诺。因为$.ajax
返回一个承诺,所以您可以只返回该值
您需要将函数引用传递给done()
,当执行partialSlide(divID)
时,您实际上是通过传递参数调用函数partialSlide
,并将从该函数返回的值(undefined
在本例中)作为done回调传递
所以
loadComments
不返回pomise,因此$。当
无事可做时。另外,您希望将函数传递给.done
。现在您正在调用partialSlide
,并将其返回值(即未定义的
)传递给。完成
foo(bar())
和foo(bar)
非常不同无需使其复杂化从加载注释返回$.ajax
,我希望jQuery ajax已经实现了承诺。@sabithpocker-是的,是的。为什么要执行$。何时($。何时(…)
?你想在那里实现什么?loadComments
不会返回pomise,所以$。当
无事可做时。另外,您希望将函数传递给.done
。现在您正在调用partialSlide
,并将其返回值(即未定义的
)传递给。完成
foo(bar())
和foo(bar)
非常不同无需使其复杂化从加载注释返回$.ajax
,我希望jQuery ajax已经实现了承诺。@sabithpocker-是的,是的。为什么要执行$。何时($。何时(…)
?你想在那里完成什么?关于.done(partialSlide(divID))
无论loadComments
是否返回承诺,调用partialSlide
,这只是问题的一部分。partialSlide看起来就像是您的完成函数,因此它不需要返回承诺或任何东西,因为它只是设置高度动画。默认情况下,jquery ajax调用返回一个承诺。如果没有给一个承诺,当我相信完成时会立即调用。@AtheistP3ace:.done(partialSlide(divID))
应该是.done(function(){.partialSlide(divID);})
那么呢无论loadComments
是否返回承诺,调用partialSlide
,这只是问题的一部分。partialSlide看起来就像是您的完成函数,因此它不需要返回承诺或任何东西,因为它只是设置高度动画。默认情况下,jquery ajax调用返回一个承诺。如果我认为没有给a的承诺,则立即调用done。@AtheistP3ace:.done(partialSlide(divID))
应该是.done(function(){partialSlide(divID);})