Jquery deferred.done无法识别函数的结果类型

时间:2014-09-11 21:11:00

标签: jquery-deferred

我创建了下面的代码,生成错误:Uncaught TypeError: Cannot read property 'done' of undefined。我想我明白这里发生了什么,def()不会推迟到超时到期且.done试图直接开始,但我不明白的是如果这不起作用,为什么延迟会起作用? .done 如何知道前面的代码是承诺/延期,因为它可能尚未解决?请解释语法使其正常工作,因为这是我的目标。

说得直白我希望.done会闭嘴并等待它的意思(我明白它必须是所有物体的方法,并等到他们甚至解决了如果不是延期,但如果您输入了.done,为什么您不想这样做?)。或者它是这样工作的,但我不知道如何正确使用它?

除非明确解决我的困惑,否则请不要将我推荐给现有的jquery延期指南/帖子。

感谢。

jsfiddle here

function def() {
    d = new $.Deferred;
    setTimeout(function(){
        d.resolve();
        return d;
    },1000)
}
def().done(function(){
    console.log('test');
});

1 个答案:

答案 0 :(得分:2)

您必须从def()本身返回承诺值,而不是setTimeout()

function def() {
    var d = $.Deferred();
    setTimeout(function(){
        d.resolve();
    },1000)
    return d;
}
def().done(function(){
    console.log('test');
});

setTimeout()返回值不会做任何事情。 def()早已完成执行(并且没有返回任何内容),并且setTimeout()的返回值只会返回到调用计时器回调的系统运行时的一部分,并被忽略。

我还做了一些其他更正:

  1. 通过将d放在声明前面,将var声明为局部变量(不是隐式全局变量)。

  2. 将延期的创建更改为$.Deferred()。虽然,我认为new构造可能有效,但jQuery没有记录其用法。