JQuery deferred.done立即执行预定义函数,但不在内部声明函数
我的问题很奇怪,正如标题中所描述的那样。 这是代码:
情况1:
var first = $.ajax({ // about 500ms request url: myUrl success: function() { console.log(1); } }); var second = $.ajax({ // about 200 ms request url: myUrl success: function() { console.log(2); } }); $.when(first, second).done(function() { console.log(3); });
记录2,1,3。一切都很好,就是我想要的。
案例2:
var first = $.ajax({ // about 500ms request url: myUrl success: function() { console.log(1); } }); var second = $.ajax({ // about 200 ms request url: myUrl success: function() { console.log(2); } }); function logthree() { console.log(3); } $.when(first, second).done(logthree());
记录3,2,1,这是一个问题。 logthree()函数应该只执行第一次和第二次解析。
为什么会这样? 如何使用案例2没有任何问题?
注意:如果第一个和第二个是函数并且它们返回$ .ajax,则会发生同样的事情。
注意:如果第一个和第二个都是$ .get,则会发生同样的事情。
改成:
$.when(first, second).done(logthree);
您正在执行logthree()
并将返回结果传递给.done()
。 您需要将函数引用传递给.done()
,它只是没有parens的logthree
。 当您添加parens时,它会指示JS解释器立即执行它。 这是一个常见的错误。
试试这个..
`$ .when(first,second).done(logthree);