2016-06-19 8 views
0

上記のサーバーのいずれかが有効であることを確認するために、別のサーバーでも同じファイルに対してもURLが異なります。それが失敗した場合は、2番目の方法などで試してみてください....他のファイルが利用できない場合は、別のURLからファイルをダウンロードしてください

私は自分の心に持っているものを使用する代わりにそれを行うより良い方法があれば?それはこれです:

var urls=["http://Url1.com","http://Url2.com","http://Url3.com"] 
    $.get(ulrs[0]).done(function() { 
     alert("success"); 
    }).fail(function() { 
     alert(" First failed!, try with second"); 
     $.get(ulrs[1]).done(function() { 
     alert("success"); 
     }).fail(function() { 
     alert("Second failed! Try with third..."); 
     $.get(ulrs[2]).done(function() { 
      alert("success"); 
     }).fail(function() { 
      alert("All failed!"); 
      }); 
     }); 
    }); 

編集:私は、異なるサイズの異なるアレイで使用するためには、それを一般化したいと思います...

答えて

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

これは逆の順序でURLを試していると思います。 – Dogbert

+1

@Dogbertあなたは正しいです、ありがとう、私はそれを 'pop()'から 'shift()'に変更しました – zlumer

+0

あまりにもチャーミーのように動作してくれてありがとう...;)そして私は "slice()"関数...ちょっと別の質問ですが、ファイルをダウンロードするにはこの関数が必要ですが、実際のURLをURL配列に入れれば、何もダウンロードされません。$ get()の代わりに何を使用しなければなりません。 .. – navy1978

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

:何か

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/

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); 
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(); 
    } 
} 
関連する問題