当我在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分钟试图找到答案,但一切似乎都超出了我想要完成的目标。
答案 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();
});
});