2017-09-01 27 views
0

我想通過Javascript或JQuery獲取許多JSON, 並將名爲j_name,j_value和j_sts的元素拉入sarr [i],rarr [i]和parr [i],分別。如何通過Javascript或JQuery異步獲取很多JSON

var sarr = new Object; 
var rarr = new Object; 
var parr = new Object; 

//num_json is the number of JSONs 
//jsonurl is a url of the JSON 
for(var i = 1; i < num_json; i++){ 
$.ajaxSetup({async: false}); 
    $.getJSON(jsonurl[i], function(data) { 
    sarr[i] = data.j_name; 
    rarr[i] = data.j_value; 
    parr[i] = data.j_sts; 
    }); 
$.ajaxSetup({async: true}); 
} 

沒有

$ .ajaxSetup({異步:假});

$ .ajaxSetup({異步:真});

,異步處理導致sarr [i],rarr [i]和parr [i]被當前加載的JSON元素填充。 我必須停止異步加載。但是,此過程顯示頁面非常慢。

我想要做的像下面這樣分開存儲JSON的對象「數據」,但它顯然是無效的。

var sarr = new Object; 
var rarr = new Object; 
var parr = new Object; 
var data = new Object; 

for(var i = 1; i < num_json; i++){ 
    $.getJSON(jsonurl[i], function(data[i]) { 
    sarr[i] = data[i].j_name; 
    rarr[i] = data[i].j_value; 
    parr[i] = data[i].j_sts; 
    }); 
} 

如何以異步方式加載許多JSON並存儲每個特定元素?

+0

使用閉包是一種方式,https://stackoverflow.com/questions/111102/how-do-javascript-closures-work?rq=1 – Adriani6

回答

1

這裏是一個辦法做到這一點

const urls = []; 

const responses = urls.map(url => fetch(url).then(res => res.json())); 
Promise.all(responses) 
    .then(dataArr => { 

     return dataArr.reduce((res, data) => { 
      res.sarr[i] = data[i].j_name; 
      res.rarr[i] = data[i].j_value; 
      res.parr[i] = data[i].j_sts; 
      return res; 
     }, { sarr: [], rarr: [], parr: [] }); 

    }) 
.then(result => { 

    const { sarr, rarr, parr } = result; 

}); 

該解決方案使用fetch API和承諾。 基本上它的作用是:給定一個url數組,請求每個url並以json的形式檢索結果,並將結果存儲在一個Promises數組中。 鑑於這一系列承諾,一旦所有請求均已解決,當且僅當所有請求都成功時才檢索結果。如果它們成功,則將每個值存儲在正確的數組中並將其返回。

相關問題