2016-09-19 17 views
1

私は1つまたは複数のソースからデータを取得しようとしていますので、データを取得して約束をするためにURLの配列を渡します。複数のソースから約束を得てデータを取得する

次に、すべてのデータを取得するためにPromise.allを使用しようとしましたが、何も得られません。

どうすればこの問題を解決できますか?

var getData = function (urls) { 

    var promises = []; 
    $.each(urls, function (index, url) { 
     var promise = new Promise(function (resolve, reject) { 
      $.ajax({ 
       type: 'get', 
       url: url, 
       dataType: 'json', 
       success: function (data) { 
        console.log(data); 
       } 
      }); 
     }); 

     promises.push(promise); 
    }); 

    console.log(promises); 

    Promise.all(promises).then(function() { 
     console.log('Complete'); 
    }); 

}; 
+0

promise.push($。 ajax({...})); ' - $ .ajaxは約束を返し、それを使用します。 –

+0

何か問題があります。データがまったく得られない場合は、PromiseやPromise.allとは関係ありません - あなたはコンソールに何もないと言っていますか? –

+0

[非同期呼び出しから応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Liam

答えて

3

あなたは配列の下にプッシュ応答を使用して行います。ここで$ .when done()

var xhr_request=[]; 
var responses=[]; 
$.each(urls, function (index, url) { 
    // you can push any aysnc method handler 
    xhr_request.push($.ajax({ 
     url: url, 
     type:'get', 
     dataType:'json', 
     data:{user_name: users[i]}, 
     success: function(data){ 
      console.log('success of ajax response') 
      responses.push(data); 
     } 
    })); 
}); 


$.when.apply(null, xhr_request).done(function(){ 
    // all done 
    console.log('all request completed') 
    console.log(responses); 
}); 

にそれを使用することができ、ゼロ以上のオブジェクト、通常は繰延オブジェクトに基づいてコールバック関数を実行するための方法を提供しています非同期イベントを表します。

$は.applyすべての非同期呼び出し後の関数である

$の.done機能で異なる引数として配列要素を変換します。要求が完了しました。

0

代わりの

var promise = new Promise(function (resolve, reject) { 
     $.ajax({ 
      type: 'get', 
      url: url, 
      dataType: 'json', 
      success: function (data) { 
       console.log(data); 
      } 
     }); 
    }); 

なぜあなたはちょうど

var promise = 
     $.ajax({ 
      type: 'get', 
      url: url, 
      dataType: 'json', 
      success: function (data) { 
       console.log(data); 
      } 
     }); 

あなたはすでにあなたの$.ajaxを通じて約束を返していません。だからあなたは別の約束の中でそれを包む必要はありません。

2

これは私がそのコードを書くような方法である(私は通常のjQueryを使用していないとして、ソートの、私は少し横たわってる)

var getData = function (urls) { 
    Promise.all($.map(urls, function (index, url) { 
     return $.ajax({ 
      type: 'get', 
      url: url, 
      dataType: 'json' 
     }); 
    })).then(function (responses) { 
     console.log('Complete'); 
     console.log(responses); // responses in an array 
    }); 
}; 

$.ajaxは約束、それをラップする必要はありませんが返されますプロミスコンストラクタで

使用$.mapの代わりに、$.eachとjQueryの約束を返す - あなたは私が私を得ることはありません何Promise.all引数

としてその全体$.mapをラップすることができますなぜあなたはあなたのコードがまったく何も得られないと言います。たとえあなたのコードが正しくなかったとしても、$ .ajaxのものをまだ起動していて、コンソール出力を得たはずです。

関連する問題