2013-09-26 51 views
10

我有這樣的代碼:調用多個JSON數據/於一體的getJSON請求文件

var graphicDataUrl = 'templating/graphic-data.json'; 
var webDataUrl = 'templating/web-data.json'; 
var templateHtml = 'templating/templating.html'; 
var viewG = $('#view-graphic'); 
var viewW = $('#view-web'); 

$.getJSON(dataUrls, function(data) { 
    $.get(templateHtml, function(template) { 
     template = Handlebars.compile(template); 
     var example = template({ works: data });   
     viewG.html(example); 
     viewW.html(example); 
    }); 
}); 

什麼是呼叫的最佳方法既dataUrl JSONs,爲了在兩個不同的div來顯示他們使用他們的數據( #viewW和#viewW)在我的網頁上?

+0

'daataUrls'似乎是未定義的。 – Utkanos

+0

是的,是讓別人明白我想要完成的佔位符 –

回答

27

最好的辦法是單獨做的每一個,並且處理錯誤情況:

$.getJSON(graphicDataUrl) 
    .then(function(data) { 
     // ...worked, put it in #view-graphic 
    }) 
    .fail(function() { 
     // ...didn't work, handle it 
    }); 
$.getJSON(webDataUrl, function(data) { 
    .then(function(data) { 
     // ...worked, put it in #view-web 
    }) 
    .fail(function() { 
     // ...didn't work, handle it 
    }); 

這允許請求並行發生,並儘快每個請求完成時更新頁面。

如果你想運行在平行的請求,但等待更新頁面,直到他們都完成,你可以做到這一點與$.when

var graphicData, webData; 
$.when(
    $.getJSON(graphicDataUrl, function(data) { 
     graphicData = data; 
    }), 
    $.getJSON(webDataUrl, function(data) { 
     webData = data; 
    }) 
).then(function() { 
    if (graphicData) { 
     // Worked, put graphicData in #view-graphic 
    } 
    else { 
     // Request for graphic data didn't work, handle it 
    } 
    if (webData) { 
     // Worked, put webData in #view-web 
    } 
    else { 
     // Request for web data didn't work, handle it 
    } 
}); 

...但頁面看起來可能因爲當第一個請求返回時你沒有更新,但只有在兩者都有時纔會更新。

+0

非常感謝!這正是我所期待的。我現在試試:) –

+0

所以現在我寫了這個:'$ .getJSON(graphicDataUrl,function(data){} {templateHtml,function(template){ \t \t template = Handlebars.compile(template) ; \t \t VAR示例=模板({作品:數據}); \t \t \t \t viewG.html(實施例); \t}); }); $ .getJSON(webDataUrl,功能(數據){ \t $獲得(templateHtml,函數(模板){ \t \t模板= Handlebars.compile(模板); \t \t VAR示例=模板({作品:數據} ); \t \t \t \t viewW.html(例如); \t}); });'但也有很多重複的代碼!而且我也可以做到而不處理錯誤? (p.s.有沒有更好的方式來編寫代碼作爲重播?) –

+0

@GiorgiaSambrotta:當然有更好的方法。 :-)你可以將它封裝在一個函數中。爲什麼你從'templateHtml'重新獲取模板而不是保留它並重用它? (這一部分在兩者之間似乎完全沒有改變。) –

10

以防萬一它可能會遇到這個—,並感謝jQuery的承諾進展— T.J.克羅德的回答,現在可以提高到一個簡潔和一般功能:

/** 
* Load multiple JSON files. 
* 
* Example usage: 
* 
* jQuery.getMultipleJSON('file1.json', 'file2.json') 
* .fail(function(jqxhr, textStatus, error){}) 
* .done(function(file1, file2){}) 
* ; 
*/ 
jQuery.getMultipleJSON = function(){ 
    return jQuery.when.apply(jQuery, jQuery.map(arguments, function(jsonfile){ 
    return jQuery.getJSON(jsonfile); 
    })).then(function(){ 
    var def = jQuery.Deferred(); 
    return def.resolve.apply(def, jQuery.map(arguments, function(response){ 
     return response[0]; 
    })); 
    }); 
}; 

但是關於不給予任何反饋給用戶—同時等待滿載—點是好的。所以對於那些更願意提供響應式反饋的人來說,這是一個稍微複雜的版本,可以支持進度。

/** 
* Load multiple json files, with progress. 
* 
* Example usage: 
* 
* jQuery.getMultipleJSON('file1.json', 'file2.json') 
* .progress(function(percent, count, total){}) 
* .fail(function(jqxhr, textStatus, error){}) 
* .done(function(file1, file2){}) 
* ; 
*/ 
jQuery.getMultipleJSON = function(){ 
    var 
    num = 0, 
    def = jQuery.Deferred(), 
    map = jQuery.map(arguments, function(jsonfile){ 
     return jQuery.getJSON(jsonfile).then(function(){ 
     def.notify(1/map.length * ++num, num, map.length); 
     return arguments; 
     }); 
    }) 
    ; 
    jQuery.when.apply(jQuery, map) 
    .fail(function(){ def.rejectWith(def, arguments); }) 
    .done(function(){ 
     def.resolveWith(def, jQuery.map(arguments, function(response){ 
     return response[0]; 
     })); 
    }) 
    ; 
    return def; 
};