jQuery链式事件没有触发

时间:2015-02-09 15:55:01

标签: javascript jquery jquery-deferred

当我在Chrome中运行时," A"和" B"已成功记录,但程序永远不会到达" C"。那是为什么?

function doSomething(){
    var chain   = $.Deferred();

    console.log("B");

    chain.then(function(){
        console.log("C");
    }).then(function(){
        console.log("D");
    });
}

$(document).ready(function(){

    $("body").click(function(){
        console.log("A")
        doSomething();
    });

});

我花了30分钟试图找到答案,但一切似乎都超出了我想要完成的目标。

2 个答案:

答案 0 :(得分:3)

你应该像这样打电话给.resolve

function doSomething(){
    var chain   = $.Deferred();

    console.log("middle");

    chain.then(function(){
        console.log("end");
    });

    chain.resolve();
}

答案 1 :(得分:3)

由jQuery处理文档时会触发$(document).ready事件,因此很早就会调用它。然后它将click处理程序绑定到body,当检测到单击事件时会触发该处理程序。记录“开始”并立即调用doSomething,这会创建Deferred并记录“中间”。

然而,你永远不会Deferred的任何事情。在解析时绑定回调,但从不resolve。因此,回调永远不会被解雇。

返回Deferred并调用其resolve方法(有或没有args)应该解决这个问题。您可能希望稍后在超时时调用它,或者立即使用事件中的args调用它。无论哪种方式,您都需要在某些时候解决(或拒绝)承诺。

function doSomething(){
  var chain = $.Deferred();

  console.log("middle");

  chain.then(function(){
    console.log("end");
  });

  return chain;
}

$(document).ready(function(){
  $("body").click(function(){
    console.log("start")
    var dfd = doSomething();
    dfd.resolve();
  });
});