我有2个ajax调用,我通过$ .when附加,以便在完成后执行某些任务。
代码如下所示:
function ajaxCall(url, targetDiv) {
dfd = new $.Deferred();
$.ajax({
url:url
success : function(data) {
dfd.resolve(data, targetDiv);
}
})
return dfd.promise()
}
d = ajaxCall('/somewhere/', 'myDiv');
d2 = ajaxCall('/somewhere/else', 'myNewDiv');
$.when(d, d2).then(function(){alert('all done');})
在这种情况下,我们从未完成所有已完成的警报调用。我们大致遵循https://api.jquery.com/deferred.promise/
的大纲当检查这个时,我们可以看到d和d2都不会调用done(如果我们附加一个done),但是调用ajax调用的成功部分。
答案 0 :(得分:3)
语法分析器模式...... STOP!
function ajaxCall(url, targetDiv) {
dfd = new $.Deferred(); // <-- Wait, a global variable?
第二个ajaxCall(...)
正在设置一个不同的Deferred
实例,并且第一个延迟将永远不会被解析(您将相同的变量设置两次,因此调用.resolve(...)
仅在第二个ajaxCall(...)
函数调用上,并且您没有解析第一个延迟对象,因为它已经消失了!)。
解决方案:
function ajaxCall(url, targetDiv) {
var dfd = new $.Deferred(); // <-- Oh! A local variable... :)
你想要一个好的建议吗?始终用var
声明变量,因为在函数作用域中声明的变量将被添加到函数实例中,而不是window
对象:
// Both sentences are equivalent in a function scope (or in the global scope)
a = "hello";
window.a = "hello";