我必须进行一堆JSONP调用,并在它们全部完成(或失败)后执行一些代码。
即:
function finished() {
alert('done!');
}
function method1() {
return $.ajax('http://example.org/endpoint', {
data: {
foo: 'bar'
},
dataType: 'jsonp'
});
}
function method2() {
return $.ajax('http://example.org/endpoint', {
data: {
baz: 'qux'
},
dataType: 'jsonp'
});
}
$.when(method1(), method2()).always(finished);
唯一的问题是,如果任何一个请求失败,finished()
将不会被调用。
我可以尝试和检测如果一个ajax调用失败,像这样:
function method1() {
var method1_timeout = setTimeout(function() {
// this call has failed - do something!
}, 5000);
var ajax = $.ajax('http://example.org/endpoint', {
data: {
foo: 'bar'
},
dataType: 'jsonp',
success: function() {
clearTimeout(method1_timeout);
}
});
return ajax;
}
但是我在这一点上卡住了-我如何告诉延迟对象,特定的ajax请求已经失败?
我尝试调用ajax对象的error()
方法:
var method1_timeout = setTimeout(function() {
ajax.error();
}, 5000);
可惜运气不好。
任何想法?
我在jsFiddle中测试了你发布的代码'as-is',即使JSONP调用失败(当然,请求返回404错误,因为example.com/endpoint
查询)。
所以我想我在jQuery文档中找到了你的问题的答案,在$.ajax
章:
服务器应该返回传递JSON的有效JavaScript响应到回调函数。$.ajax()将执行返回JavaScript,调用JSONP回调函数将响应中包含的JSON对象传递给$.ajax()成功处理程序。
检查你的JSONP返回的JS代码是否有效,检查你的控制台是否有任何语法错误,这会阻止你的JS代码在你的一边执行(并防止always
函数被执行)。
编辑:我复制你的错误。当使用jQuery时x (edge),它像预期的那样工作(尝试那里)。传递给jQueryx (edge),两个方法调用都在工作,但always
函数从未被调用(尝试在那里)。我所有的测试都是在Google Chrome下完成的。
settimeout在JS的全局作用域中,您在函数中创建了变量ajax。试着
var method1_timeout = function(){ ajax.error();}
在函数中定义var ajax,然后将method1_timeout作为回调提供给setTimeout。
setTimeout(method1_timeout, 5000);