问答详情
源自:4-1 异步编程的处理

发现一个代码问题

第69行直接返回dtd是不对的。必须返回dtd.promise()。原因是jQuery规定,任意一个deferred对象有三种执行状态----未完成,已完成和已失败。如果直接返回dtd,$.when()的默认执行状态为"已完成",立即触发后面的done()方法,这就失去回调函数的作用了。dtd.promise()的目的,就是保证目前的执行状态----也就是"未完成"----不变,从而确保只有操作完成后,才会触发回调函数。

提问者:平沙落雁式 2016-01-10 18:08

个回答

  • echo_kinchao
    2016-01-11 10:02:52
    已采纳

    主要是他还要促发另外一个动画的事件

  • 仙子鸟3621558
    2016-10-31 11:31:49

    $("#block3").animate({

                    width: "50%"

                }, 2000, function() {

                    dtd.resolve(); // 改变Deferred对象的执行状态

                });

    这个动画的回调函数已经改变了Deferred对象的执行状态,所以可以直接返回dtd对象