我必须进行一堆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);
但没有运气。
有什么想法吗?
答案 0 :(得分:0)
我测试了您发布的代码'原样'在jsFiddle中它可以工作,即使JSONP调用失败(当然,请求因example.com/endpoint
查询而返回404错误)。
所以我认为我在jQuery文档中找到了问题的答案,在$.ajax
章节中:
服务器应返回传递JSON的有效JavaScript 响应回调函数。 $ .ajax()将执行 之前返回JavaScript,调用JSONP回调函数 将响应中包含的JSON对象传递给$ .ajax() 成功经纪人。
检查您的JSONP返回的JS代码是否有效,并检查您的控制台中是否有任何语法错误,这将停止执行您的JS代码(并阻止always
功能待执行)。
编辑:我转载了您的错误。使用 jQuery 2.x(边缘)时,它的工作方式与预期的(try there)相同。传递到 jQuery 1.x(边缘),两个方法调用正在工作,但永远不会调用always
func(try there)。我的所有测试都是在谷歌浏览器下完成的。
答案 1 :(得分:-1)
setTimeouts在JS的全局范围内,您在函数内创建了变量ajax。试试
var method1_timeout = function(){ ajax.error();}
在您定义var ajax的函数内部,然后将method1_timeout作为回调提供给setTimeout。
setTimeout(method1_timeout, 5000);