2015-10-20 53 views
1

我有我的页面上预览的职位列表。当他们被点击时,他们应该加载帖子的全文,加载评论,并向下滑动以揭示两者。为什么我的'then`事件在我的'when'事件结束之前开始了?

我有一个函数,partialSlide,模拟slideDown,但从指定的高度开始 - 它是从this answer改编的。另外两个函数loadFullPost和loadComments是我的。

所有事件都在触发,但partialSlide在loadComments完成之前触发,所以在计算高度时没有考虑到它们,因此它们被切断。

为什么当我将它们设置为when> then格式时会发生这种情况?

$.when(loadComments(divID,postID)).done(partialSlide(divID)); 

我误解了承诺如何在jQuery中工作?在我的代码中的其他地方,它们按预期工作(then只在when完成后才运行)。下面

全功能:

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);  
} 
+0

'loadComments'不返回pomise,所以'$ .when'无关。另外,你想传递一个函数到'.done'。现在你正在调用'partialSlide'并将它的*返回值*(它是'undefined')传递给'.done'。 'foo(bar())'和'foo(bar)'非常不同。 –

+1

http://jsfiddle.net/arunpjohny/306t2cez/1/ - 没有必要让复杂的 –

+0

从'load comments'返回'$ .ajax',我希望jQuery ajax已经实现了Promise。 – sabithpocker

回答

2

前面已经解释过的评论也有在代码中的多个问题,如

  1. $.ajax()返回一个承诺对象,因此没有必要将它传递给$.when()
  2. 既然你在loadComments中的ajax请求完成后想要做某事,您需要从中返回一个承诺。由于$.ajax返回一个承诺,你可以返回值
  3. 你需要一个函数引用传递给done(),当你做partialSlide(divID)你实际上是通过将参数调用该函数partialSlide并通过(undefined从它返回的值这种情况)作为完成的回调。

所以

function loadFullPost(permalink, divID, postID) { 
    $.ajax({ 
     url: permalink + "?ajax=true", 
     success: function (result) { 
      $("#" + divID + "").html(result); 
      loadComments(divID, postID).done(function() { 
       partialSlide(divID) 
      }) 
     } 
    }) 
} 

function loadComments(divID, postID) { 
    return $.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); 
} 
4

我觉得你的问题可能是loadComments不具有这样的回报的承诺永远不会给予时。

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) }); 
+1

'.done(partialSlide(divID))''? - 不管'loadComments'是否返回promise,都调用'partialSlide' –

+1

这只是问题的一部分。 –

+0

partialSlide只是看起来像它的完成函数,所以它不需要返回一个承诺或任何东西,因为它只是创造一个高度。 jquery ajax调用默认返回一个承诺。 – AtheistP3ace

相关问题