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」回調之後調用,具體取決於需要更長的時間。
+1好的一個! ;) – Yoshi 2012-03-09 12:08:16
工作,謝謝 – Sergey 2012-03-12 06:58:57