我创建了下面的代码,生成错误: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');
});
答案 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()
的返回值只会返回到调用计时器回调的系统运行时的一部分,并被忽略。
我还做了一些其他更正:
通过将d
放在声明前面,将var
声明为局部变量(不是隐式全局变量)。
将延期的创建更改为$.Deferred()
。虽然,我认为new
构造可能有效,但jQuery没有记录其用法。