2016-07-11 11 views
1

私は数値のリストを持っていて、APIから数値を照会して作成したJSONオブジェクトの配列を作成したいと思います。たとえば、番号がある場合JSONオブジェクトのjquery約束の完了を確認するための最良のパターンは何ですか?

numbers = [1, 4]; 

は、それから私は、JSONオブジェクトは、同じように作成します:

[{ 
    number: 1, 
    data: $.getJSON('/api/numbers/1') 
}, 
{ 
    number: 4, 
    data: $.getJSON('/api/numbers/4') 
}] 

対応するJSONオブジェクトに番号のリストをマップするだろう、私は思うだろう最も簡単な方法:

numbers_data = numbers.map(n => {number: n, data: $.getJSON('/api/numbers'+ n)}) 

しかし、かつて私は、私は、すべてのAPI呼び出しが完了したときに伝える方法がわからないんだけど、組み込み$.getJSON約束とnumbers_dataを持っています。変数numbers_dataが完全に解決されたので、私はそれを使って何かできるのかを教えてくれるパターンはありますか?

+0

あなたは '$ .when'が一つに約束を「組み合わせる」とし、すべてが完了したときに知ってコールバックをアタッチすることができます。 –

+0

最後に、オブジェクトに約束やAJAX呼び出しから返されたJSONデータを含めるにはどうすればいいですか?] –

+0

[jQuery Deferredsの配列でどうやって作業しますか?](http://stackoverflow.com)/q/4878887/1048572)? – Bergi

答えて

0

$.whenを使用すると、基本的に約束を1つにまとめることができます。 .done()ハンドラを$.whenの出力に添付して、すべて AJAX呼び出しが完了したことを一度知ることができます。返されたすべてのJSONデータにアクセスし、必要に応じてそれを使用/構築することができます。このような

何か:

var promises = [], 
    numbers_data = numbers.map(number => { 
     var data = $.getJSON('/api/numbers'+number); 

     promises.push(data); 
     return {number, data}; 
    }); 

// This will let you know once *all* promises are resolved. 
$.when.apply($, promises).done(() => { 
    // Each argument is an array with the following structure: [ data, statusText, jqXHR ] 
    for(var i = 0, len = arguments.length; i < len; i++){ 
     numbers_data[i].data = arguments[i][0]; 
    } 
}); 
+0

それは私が元々持っていた解決策です、私はちょうどそれを行うためのより機能的な方法があったかと思っていました。とにかく、これは最終的には最も簡単な解決策になるかもしれません。 – danield9tqh

+1

@ダニエル_「もっと機能的な方法があるのか​​どうか疑問に思っていた」_「機能性が高い」とはどういう意味ですか? – guest271314

+1

現在、Cleanerは$ .when.apply()をPromise.all()に置き換えることができます。 'then()'の結果は、応答データのみの真の配列です – charlietfl

関連する問題