Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.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 为什么我的'then'事件在我的'when'事件完成之前触发?_Javascript_Jquery_Promise_.when - Fatal编程技术网

Javascript 为什么我的'then'事件在我的'when'事件完成之前触发?

Javascript 为什么我的'then'事件在我的'when'事件完成之前触发?,javascript,jquery,promise,.when,Javascript,Jquery,Promise,.when,我的页面上有一个预览帖子列表。当他们被点击时,他们应该加载文章的全文,加载评论,然后向下滑动以显示两者 我有一个函数partialSlide,它模拟向下滑动,但从指定的高度开始-它是从。另外两个函数loadFullPost和loadComments是我的 所有事件都会触发,但partialSlide会在loadComments完成之前触发,因此在计算高度时没有考虑到它们,因此它们会被切断 当我将它们设置为when>then格式时,为什么会发生这种情况 $.when(loadComments(di

我的页面上有一个预览帖子列表。当他们被点击时,他们应该加载文章的全文,加载评论,然后向下滑动以显示两者

我有一个函数partialSlide,它模拟向下滑动,但从指定的高度开始-它是从。另外两个函数loadFullPost和loadComments是我的

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

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

$.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);})