我有不同的网址到不同的服务器,但相同的文件,以确保上述服务器之一是活着的我想尝试从第一个下载,如果失败尝试与第二个等等... ..
如果有更好的方法,而不是使用我心中的那个?就是这样:
mask = (data.conc == 50) & (data.id_exp == 'Pxxx')
编辑:我想概括它,以便与不同大小的不同阵列一起使用......
答案 0 :(得分:3)
使用递归:
function requestNext(arr, success, error) {
if (!arr.length)
return error();
function onError() {
alert(url + " failed!");
requestNext(arr, success, error);
}
var url = arr.shift();
$.get(url).done(success).fail(onError);
}
var urls = ["http://Url1.com","http://Url2.com","http://Url3.com"];
requestNext(urls, function(){ alert("success"); }, function(){ alert("all failed") });
此函数完成后,urls
数组将发生变异。如果您不希望发生这种情况,请传递副本:
requestNext(urls.slice(), function(){ alert("success"); }, function(){ alert("all failed") });
或者使用Dogbert的解决方案,将var url = arr.shift();
更改为:
var url = arr[0];
arr = arr.slice(1);
答案 1 :(得分:3)
您可以使用简单的递归函数:
function tryGet(urls, done, fail) {
if (urls.length == 0) {
fail();
} else {
$.get(urls[0])
.done(done)
.fail(function() {
tryGet(urls.slice(1), done, fail);
});
}
}
演示:
tryGet(["http://Url1.com", "http://Url2.com", "http://Url3.com"], function(_, _, resp) {
console.log(resp.status);
}, function() {
console.log("all failed");
});
tryGet(["http://Url1.com", "http://Url2.com", "http://Url3.com", "/"], function(_, _, resp) {
console.log(resp.status);
}, function() {
console.log("all failed");
});
答案 2 :(得分:1)
您的一般方法几乎是唯一可用的方法。无论如何,你必须发出多个请求,每个请求在第一个等待之前完成之后才被解雇。
您可以做的是让您的代码更具可读性,而不是所有嵌套,并使其动态化,以便它可以使用N个URL。类似的东西:
var urls = ['url-1', '/', 'url-2'/* etc */], next_index = 0;
function do_req() {
$.get(urls[next_index]).done(success).error(function() {
next_index++;
if (urls[next_index]) do_req(); else alert('All URLs failed');
});
}
function success() {
alert('Address '+(next_index+1)+' ('+urls[next_index]+') worked!');
}
do_req();
答案 3 :(得分:1)
您可以使用递归。每当ajax请求失败时,使用下一个url进行另一个ajax调用: -
var url = ["http://url1.com", "http://url2.com"]
var makeCall = function(url, index){
var xhr = $.ajax(url[index])
.done(function(data) {
console.log("Got the data");
})
.fail(function() {
console.log("Error : trying next url");
makeCall(url, index+1);
});
}
makeCall(url, 0);
答案 4 :(得分:0)
使用递归是一种很好的方法,正如在主题顶部提到的那样。
function loadFirst(query, successHandler, failHandler) {
// Load next if any item in array exists
if (Array.isArray(query) && query.length) {
// Get next item and remove it from query
$.get(query.splice(0, 1))
// First successfull response
.done(function (response) { successHandler(response); })
// Go to the next iteration if request failed
.fail(function() { loadFirst(query); });
} else {
// All requests failed
failHandler();
}
}