2016-12-09 2 views
0

私は答えを探しましたが、プレーンなJavascriptでは何も見つかりませんでした。適切な方法は何でしょうか?私は同じアプローチを繰り返し使用しようとしましたが、うまくいきませんでした。純粋なJavascriptでこれをどのように解決できますか?プレーンJavaScriptを使用してajax呼び出しをチェーンする方法

 function someFunction(){ 
    var url = "someUrl"; 
    var xmlhttp = new XMLHttpRequest(); 
    xmlhttp.open("GET", url, true); 
    xmlhttp.send(); 
    xmlhttp.onreadystatechange = function(){ 
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200){ 
     obj = JSON.parse(xmlhttp.responseText); 
     length = obj.ajax.length; 
     for(var i = 0; i < length; i++){ 
      try{ 
       var someVar = obj.ajax.elements[i].id; 
       var url2 = "someOtherUrl"+someVar+"/features"; 
       var xmlhttp = new XMLHttpRequest(); 
       xmlhttp.open("GET", url, true); 
       xmlhttp.send(); 
       xmlhttp.onreadystatechange = function(){ 
       if (xmlhttp.readyState == 4 && xmlhttp.status == 200){ 
       obj2 = JSON.parse(xmlhttp.responseText); 
       length2 = obj2.ajax.length; 
       for(var j= 0; j < length2; j++){ 
       var elementNames = obj2.elements[j].name; 
       } 
      } 
      } 
      } 
      } 
     } 
+1

使用約束。それらは単純なJavaScriptです。 –

+0

http://stackoverflow.com/questions/30008114/how-do-i-promisify-native-xhr –

+1

ああ、私は実際にJSにはかなり新しく、約束を知らなかったので、私はそれらを使ってみようどのように現時点ではわからないが、ありがとう。 – ricster

答えて

0

これは、再帰的にsomeFunction()と呼ぶことができます。
これを行うには、200 ok応答後に同じ関数を呼び出すだけです。
次のコードでは、チェーン内の一定量の要求の後にフォームの再帰的コールバックスタックを返すという制限を追加しました。

EDIT:複数のURLのための

callDone = 0; 
 
urls = ['http://url1','http://url2','http://url3']; 
 
totalCall = urls.length - 1; 
 

 
function someFunction(){ 
 
    
 
    //Edit: > Fetch url from array 
 
    var url  = urls[ callDone ] ; 
 
    var xmlhttp = new XMLHttpRequest(); 
 
     xmlhttp .open("GET", url, true); 
 
     xmlhttp .send(); 
 
     xmlhttp .onreadystatechange = function() 
 
     { 
 
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200){ 
 
       //your stuff with response... 
 
     
 
       if(callDone < totalCall){ 
 
       callDone++; 
 
       someFunction(); 
 
       } 
 
       else{ 
 
        return; 
 
       } 
 
      } 
 
     } 
 
}

+0

しかし、私は同じ機能を呼び出す場合、2番目のajax URLをどのように使用できますか? – ricster

+0

@ricsterチェックアウトポスト編集 –

関連する問題