【发布时间】:2015-04-27 13:22:01
【问题描述】:
我要解决的问题:我想要两个 ajax 函数数组。一个应该首先运行的 topPriority,另一个具有低优先级的将在所有 topPriority 调用完成后立即启动。
然而,这个函数甚至没有在$.when 行中被调用。我使用正确吗?
//HTML:
<div id="foo">Hello World</div>
//CSS:
#foo{ border:1px solid red; padding:10px; display:none }
//Javascript:
// open your console!
function getData(){
return $.get('/echo/html/');
}
function showDiv(){
var dfd = $.Deferred();
$('#foo').fadeIn( 1000, dfd.resolve );
return dfd.promise();
}
var topPriorityFunctions = new Array();
topPriorityFunctions.push(showDiv);
topPriorityFunctions.push(getData);
$.when.apply($, topPriorityFunctions )
.then(function( ajaxResult ){
console.log('The animation AND the AJAX request are both done!');
// ‘ajaxResult’ is the server’s response
// start my lowPriorityTasks.
});
Here 是所有这些代码的小提琴,以便能够对其进行测试和修改。
参考:我试图从这个page 上的工作示例进行修改,以解决我的问题。
【问题讨论】:
-
不要将
dfd.resolve直接作为回调传递。resolve()将被调用,this绑定到$("#foo")[0]而不是dfd,这很可能会破坏实现。传递一个调用dfd.resolve()的匿名函数。 -
注意:您可以将
$('#foo').fadeIn( 1000, dfd.resolve )更改为简单的return $('#foo').fadeIn(1000).promise(),因为这将返回动画队列承诺 -
感谢@frédéricHamidi。我不太明白你的解释。为什么我的函数甚至没有被调用?我真的不太关心函数 showDiv 是一个 Deferred 对象,因为我的问题实际上有点不同。我所有的函数都只是 ajax 调用。
-
@cacho,看起来像一个小提琴问题。使用 jQuery (edge),我的浏览器显示
Blocked loading mixed active content "http://code.jquery.com/jquery-compat-git.js"。使用 jQuery 2.1.0 调用函数。 -
@TrueBlueAussie,假设在 1 秒延迟期间
#foo上没有启动其他动画,是的。
标签: jquery ajax jquery-deferred .when