用于并行加载依赖数据源的Coffeescript / Javascript设计模式

时间:2011-03-03 18:49:34

标签: javascript jquery design-patterns asynchronous coffeescript

我有两个(慢速加载)数据源。我可以在加载后立即开始处理数据源2,但是需要来自1和2的数据来处理来自源1的数据。所以我有一些这样的代码:

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

但是,我希望并行加载它们,而不是顺序加载它们(即我不想在开始加载数据源1之前等待加载数据源2)。

有没有好的设计模式可以做到这一点?

2 个答案:

答案 0 :(得分:7)

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

使用jQuery 1.5中的新$.when

在这里你可以并行加载它们。并使用$.get返回的“promises”在准备就绪后运行某些功能。

答案 1 :(得分: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