jQuery 链式事件未触发

jQuery chained events aren't firing

本文关键字:事件 jQuery      更新时间:2023-09-26

当我在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分钟里,我一直在试图找到答案,但一切似乎都超出了我想要完成的任务。

你应该像这样调用 .resolve。

function doSomething(){
    var chain   = $.Deferred();
    console.log("middle");
    chain.then(function(){
        console.log("end");
    });
    chain.resolve();
}

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

然而,你从来没有真正用这个Deferred任何事情。在解析回调时绑定回调,但从不解析回调。因此,永远不会触发回调。

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

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();
  });
});