第69行直接返回dtd是不对的。必须返回dtd.promise()。原因是jQuery规定,任意一个deferred对象有三种执行状态----未完成,已完成和已失败。如果直接返回dtd,$.when()的默认执行状态为"已完成",立即触发后面的done()方法,这就失去回调函数的作用了。dtd.promise()的目的,就是保证目前的执行状态----也就是"未完成"----不变,从而确保只有操作完成后,才会触发回调函数。
主要是他还要促发另外一个动画的事件
$("#block3").animate({
width: "50%"
}, 2000, function() {
dtd.resolve(); // 改变Deferred对象的执行状态
});
这个动画的回调函数已经改变了Deferred对象的执行状态,所以可以直接返回dtd对象