2

2 つの (読み込みが遅い) データ ソースがあります。データ ソース 2 がロードされるとすぐに作業を開始できますが、ソース 1 のデータを処理するには、1 と 2 の両方のデータが必要です。したがって、次のようなコードがあります。

$.get 'url2', (data2) ->
    $.get 'url1', (data1) ->
        # do stuff with data1 and data2
    # do stuff with data2

しかし、それらを順次ではなく並行してロードしたい (つまり、データ ソース 1 のロードを開始する前に、データ ソース 2 のロードを待ちたくない)。

これを行うための優れた設計パターンはありますか?

4

2 に答える 2

7
var one = $.get 'url1'
var two = $.get 'url2'
$.when(one, two).then #both
$.when(two).then #just two

$.whenjQuery 1.5の新しいものを使用します。

ここで、両方を並行してロードします。から返された「約束」を使用して、$.get準備ができたら関数を実行します。

于 2011-03-03T18:56:46.933 に答える
0

次のようなヘルパー クラスを作成します。

class DeferredExecution
    getExecuteFunc: ->
        (x...) =>
            if !@onExecFunc
                @args = x
            else
                @onExecFunc x...
    onExecute: (func) ->
        @onExecFunc = func
        if @args
            @onExecFunc @args...
            @args = null

そして、あなたは簡単に行うことができます:

deferredFunc = new DeferredExecution()
$.get 'url1', deferredFunc.getExecuteFunc()
$.get 'url2', (data2) ->
    deferredFunc.onExecute (data1) -> # gets executed only after we get the data from url1
        # do stuff with data1 and data2
    # do stuff with data2
于 2011-03-03T18:50:01.923 に答える