如果其他网址不可用,请从其他网址下载文件

时间:2016-06-19 15:46:27

标签: javascript jquery

我有不同的网址到不同的服务器,但相同的文件,以确保上述服务器之一是活着的我想尝试从第一个下载,如果失败尝试与第二个等等... ..

如果有更好的方法,而不是使用我心中的那个?就是这样:

mask = (data.conc == 50) & (data.id_exp == 'Pxxx')

编辑:我想概括它,以便与不同大小的不同阵列一起使用......

5 个答案:

答案 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");
});

https://jsfiddle.net/Dogbert/t89xn9ej/

答案 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();
    }
}