2012-03-09 114 views
2

我想讓我的頭繞過JQuery延遲對象。我正在研究一個JS框架,它加載一個模板和一些JSON對象,並使用這些對象生成一些HTML。最初的方法是加載它們依次(僞代碼):JQuery延遲對象和Ajax調用

load_template(template_url, function (template_data) { 
    load_json(json_url, function (json_data) { 
     render(template_data, json_data); 
    }); 
}); 

這是次優的,因爲只有JSON開始模板被加載之後加載。我修改了這個使用Deferred對象:

$.when(load_template, load_json).done(function (template_xhr, json_xhr) { 
    render(template_xhr[0], json_xhr[0]); 
}); 

到目前爲止好。現在我稱之爲「partials」,它是一些內聯HTML片段,它們是從單獨的模板和JSON數據構建的,這些數據是異步請求的,然後插入到頁面中。目前我啓動主模板之後被渲染加載它們:

load_template(template_url, function (template_data) { 
    load_json(json_url, function (json_data) { 
     render(template_data, json_data); 
     $.each(partials, function (idx, partial_url) { 
      load_partial(partial_url, function (partial_data) { 
       $("#some-element-id").html(partial_data); 
      }); 
     }); 
    }); 
}); 

這又是次優的,因爲我可以啓動主模板後立即同時加載它們。

然而,這個問題的問題是partials可以在主模板被加載和渲染前完成加載,所以無處插入它們。或者他們可以晚點結束。

堅持成一個單一的$。當()的調用是不好的,因爲我想盡快主模板和JSON數據準備顯示頁面,所以下面是行不通的:

$.when(load_template, load_json, load_partial_template, load_partial_json, ...).done(function (template_xhr, json_xhr, ...) { 
    render(template_xhr[0], json_xhr[0]); 
    insert_partial(...); 
}); 

所以,問題是:

是否有可能,使用Deferred對象,建立了一系列的AJAX請求,因此他們被分成幾個組:

  • 所有的請求都在相同的T啓動ime
  • 當來自「group 1」的請求完成時,將調用回調函數
  • 「group 2」...「group n」的回調保證不會在「group 1」回調之前被調用,但它們是仍然會在相應的請求完成之後或「組1」回調之後調用,具體取決於需要更長的時間。

回答

2

你可以爲你的partials和單個主Deferred建立一個Deferreds的集合,然後在Deferred主要完成後只做部分結果嗎?

var dfdPartials = []; 
$.each(partials, function (idx, partial_url) { 
    dfdPartials.push($.when(createDeferredForPartial(partial_url)); 
}); 

var dfdTemplate = $.when(load_template, load_json).done(function (template_xhr, json_xhr) { 
    render(template_xhr[0], json_xhr[0]); 
    $.each(dfdPartials, function (idx, dfd) { 
     dfd.done(function (partial_data) { 
      $("#some-element-id").html(partial_data); 
     }); 
    }); 
}); 
+0

+1好的一個! ;) – Yoshi 2012-03-09 12:08:16

+0

工作,謝謝 – Sergey 2012-03-12 06:58:57