Шаблон дизайна Coffeescript / Javascript для параллельной загрузки зависимых источников данных - PullRequest
2 голосов
/ 03 марта 2011

У меня есть два (медленная загрузка) источника данных. Я могу начать работать с источником данных 2, как только он будет загружен, но мне нужны данные как из 1, так и из 2, чтобы работать с данными из источника 1. Поэтому у меня есть некоторый код, подобный этому:

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

Но я хочу загрузить их параллельно, а не последовательно (т.е. я не хочу ждать загрузки источника данных 2, прежде чем начинать загрузку источника данных 1).

Есть ли какие-нибудь красивые шаблоны для этого?

Ответы [ 2 ]

7 голосов
/ 03 марта 2011
var one = $.get 'url1'
var two = $.get 'url2'
$.when(one, two).then #both
$.when(two).then #just two

используйте новую $.when из jQuery 1.5.

здесь ваша загрузка их обоих параллельно. И используя «обещания», возвращаемые из $.get, чтобы запустить некоторую функцию, как только они будут готовы.

0 голосов
/ 03 марта 2011

Создайте вспомогательный класс, например, так:

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
...