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);