我有一個index.json
文件,該文件返回需要加載的其他N
JSON文件的列表。他們需要使用不同的方法加載,這樣當他們全部加載時,我可以一次處理它們。jQuery加載未知數量的JSON文件與錯誤處理
附加JSON文件中的每一個都可能存在或不存在於服務器上。
我用下面的方法來加載數據,在服務器上實際存在的所有文件的正常工作:
$.getJSON('index.json').then(function (response) {
var files = response.files;
$.when
.apply(null, getDeferreds(files))
.done(function() {
//process the files
})
});
});
function getDeferreds(files) {
var deferreds = [], i;
for (i in files) {
//file type 1
deferreds.push(
$.getJSON(files[i] + '_1.json')
.then(function (response) {
//do something
})
);
//file type 2
deferreds.push(
$.getJSON(files[i] + '_2.json')
.then(function (response) {
//do something
})
);
}
return deferreds;
};
這種做法的偉大工程,但是.... 當任何文件缺失,即somefile_2.json
(有時索引將在文件實際存在於服務器上之前創建),整個過程失敗並且沒有數據正在被檢索。
在$.getJson (
或$.get
)我可以用.fail()
方法檢測錯誤,但是這並不妨礙通話的失敗,.done()
永遠不會被調用。
我該如何重構這個方法,使.done()
方法始終有效,即使有些文件丟失了?
嘗試將[第二個函數](https://api.jquery.com/deferred.then/#deferred-then-doneCallbacks-failCallbacks)傳遞給'.then',以返回失敗請求的佔位符(空對象) ,像'.then(function()...,function(){return {};});' –
這與'.fail()'有相同的效果。它檢測到404錯誤,但仍然導致整個過程失敗。 – Yani