2016-11-07 6 views
1

私は配列の情報が必要なときに実行する前にajax呼び出しが実行されるのを待つために、残りのコードを取得しようとしています。私は複数のアプローチを試みましたが、なぜそうしないのかわかりません。このような状況では、約束を使用するのがベストプラクティスであるようです。現在、ajaxは.doneと最後のconsole.log(3)の後に実行されます。ajaxデータを取得する約束を使用する

参照してください以下のコード:

$(document).ready(function(){ 
    var selectedChannels = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"]; 
    var numberOfChannels = selectedChannels.length; 
    var onlineChannels = []; 
    var offlineChannels = []; 

function getChannels(){ 

for (var count = 0 ; count < numberOfChannels; count++) { 

    $.ajax({ 
    url: "https://wind-bow.hyperdev.space/twitch-api/streams/"+ selectedChannels[count], 
    type: "get", 
    dataType: "jsonp", 
    callback: "?", 
     data: { 
     }, 
     success: function(data) { 
      if (data.stream) { 
       var logo = data.stream.channel.logo 
       var twitchName = data.stream.channel.display_name 
       var details = data.stream.channel.status 
       var link = data.stream.channel.url 
       onlineChannels.push(twitchName); 
       console.log(onlineChannels); 
       console.log(1); 

       $(".display-area").append("<div class=\"result-box online\"><img src="+ logo +" alt=\"twitchName\" class=\"profile-img\"></img><div class=\"title\">"+ twitchName +"</div><div class=\"description\">"+ details +"</div>"); 

      } 
     }, 
    }).done(function(){ 

    }); 
} 

} 

/* should run after ajax and onlineChannels array has been populated */ 
function completeAjax() { 
    var promised = getChannels(); 
    var promisedComplete = $.when(promised); 
    promisedComplete.done(function(){ 
    console.log(onlineChannels); 
    console.log(2); 
    }); 
} 

completeAjax(); 

console.log(3) 
}); 
+0

あなたは幾分不明です。 'done()'メソッドはすでにajax呼び出しが完了するのを待っていますか?あなたはループでAJAXコールを持っていますが、本当にあなたは**それらのすべてが完了するのを待つことを意味しましたか? – adeneo

+0

こんにちは、はい、申し訳ありません、完全なAjax()関数のコードに移動する前に、ループのすべてのループを完了する必要があります。 – jaemsnrg

+0

これはあなたの後に何を明確にします。あなたのajax呼び出しが完了した後にcompleteAjax関数を実行したい場合は、完全なセクションに入れてください。ループして複数のajax呼び出しを実行する場合は、jQueryの.done機能を使用する必要があります。 (jQueryのdone関数にcompleteAjax関数を追加してください。 –

答えて

3

あなたはAJAX呼び出しをマップし、約束を返し、その後、すべてのAJAX呼び出しが

$(document).ready(function() { 
    var selectedChannels = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"]; 
    var onlineChannels = []; 
    var offlineChannels = []; 

    function getChannels() { 
     return $.map(selectedChannels, function(channel, index) { 
      return $.ajax({ 
       url  : "https://wind-bow.hyperdev.space/twitch-api/streams/" + channel, 
       type  : "GET", 
       dataType : "jsonp", 
       callback : "?", 
       data  : {} 
      }).done(function(data) { 
       if (data.stream) { 
        var logo  = data.stream.channel.logo; 
        var twitchName = data.stream.channel.display_name; 
        var details = data.stream.channel.status; 
        var link  = data.stream.channel.url; 

        onlineChannels.push(twitchName); 

        $(".display-area").append("<div class=\"result-box online\"><img src=" + logo + " alt=\"twitchName\" class=\"profile-img\"></img><div class=\"title\">" + twitchName + "</div><div class=\"description\">" + details + "</div>"); 
       } 
      }); 
     }); 
    } 

    $.when.apply($, getChannels()).done(function() { 
     // all done, onlineChannels populated 
    }); 

}); 
+0

実際、これはより良い解決策です。 – trincot

+0

@trincot - ありがとう! – adeneo

+0

ありがとう、これはエレガントな解決策に見えます、私は読んで行きますこれらのメソッドのいくつかでアップ。 – jaemsnrg

1

はあなたが使用することができます完了していることを確認するために$.when.applyを使用することができますあなたのカウンターを0にカウントダウンして、まだ多くのAjaxコールがまだ終了する必要があるかを確認してください。

for (var count = 0 ; count < numberOfChannels; count++) { 
    $.ajax({ 
     // ... 
     success: function(data) { 
      count--; // <!--------- decrease count 
      // ... 
     }, 
    }).done(function(){ 
     if (!count) { // <!--------- see if this was the last one finishing. 
      // All Ajax done. 
      // ...following tasks are initiated here. 
      // 
     } 
    }); 
} 

この動作方法を理解するには、ループが終了する前にsuccessdoneコールバックが呼び出されず、countが最大に達していることを理解することが重要です。それ以来、countは減少しています。

関連する問題