2015-10-02 15 views
1

我不得不做幾個getjson調用來從谷歌電子表格中獲取一些數據,並將我需要的數據存儲到一個數組,並過濾​​數組並顯示數據。我的第一個getjson完成之前,我的當前代碼需要大量的數據傳遞數組,所以我最終得到了數組中的不完整數據!如何在所有getjson調用完成時纔將對象數組傳遞給另一個函數?

有沒有一種方法,我的最後一個getjson發送數組到另一個函數,只有當所有先前的getjson調用完成之前(包括它自己)將數組傳遞給另一個函數?

<script> 
     var files = new Array(); 

      function pushtoArray(){ 

     //first getjson call 
     var url1 = "https://spreadsheets.google.com/feeds/list/xxxxx/xxxxx/public/values?alt=json"; 
      $.getJSON(url1, function(data) { 

       var entry = data.feed.entry; 

       $(entry).each(function(){ 
       // Column names are name, age, etc. 
      count++; 
      files.push({ url: this.gsx$url.$t, filename: this.gsx$name.$t }); 



       }); 

      alert(files.length); 
      print_r(files); 
      console.log(files); 
      });//end of ajax call 

     //second getjson call 
    var url2 = "https://spreadsheets.google.com/feeds/list/xxxxx/xxxxx/public/values?alt=json"; 
      $.getJSON(url2, function(data) { 

       var entry = data.feed.entry; 

       $(entry).each(function(){ 
       // Column names are name, age, etc. 
      count++; 
      files.push({ url: this.gsx$url.$t, filename: this.gsx$name.$t }); 


       }); 

      alert(files.length); 
      passArray(files); 
      console.log(files); 
      });//end of ajax call 


      };//end of function 


    function passArray(files){ 
    alert(files.length); 
    console.log(files); 

    // do some data filtering from array passed 

     </javascript> 
    <body onload="pushtoArray()"> 

編輯:我改變

var entry1 = resultFromUrl1.feed.entry; 
     var entry2 = resultFromUrl2.feed.entry; 

var entry1 = resultFromUrl1[0].feed.entry; 
    var entry2 = resultFromUrl2[0].feed.entry; 

,並固定錯誤!

回答

2

使用Promises。

var promiseA = $.getJSON(urla..); 
var promiseB = $.getJSON(urlb..); 

$.when(promiseA, promiseB).then(function(resultA,resultB){ 
//do whatever you want with results. 

}); 

編輯:這是你的代碼編輯,可能與var entry = ...一個問題,如果這樣的話只是看取值範和ENTRY2在調試:

var files = new Array(); 

function pushtoArray() { 

    //first getjson call 
    var url1 = "https://spreadsheets.google.com/feeds/list/xxxxx/xxxxx/public/values?alt=json"; 
    var url1Promise = $.getJSON(url1, function (data) { 
     console.log("url1 success"); 
    });//end of ajax call 

    //second getjson call 
    var url2 = "https://spreadsheets.google.com/feeds/list/xxxxx/xxxxx/public/values?alt=json"; 
    var url2Promise = $.getJSON(url2, function (data) { 
     console.log("url2 success"); 
    });//end of function 

    $.when(url1Promise, url2Promise).then(function (resultFromUrl1, resultFromUrl2) { 
     var entry1 = resultFromUrl1.feed.entry; 
     var entry2 = resultFromUrl2.feed.entry; 

     var entry = entry1.concat(entry2); 

     $(entry).each(function() { 
      // Column names are name, age, etc. 
      count++; 
      files.push({ url: this.gsx$url.$t, filename: this.gsx$name.$t }); 
        alert(files.length); 
        print_r(files); 
        console.log(files); 


     }); 


    }); 
+0

感謝您的答覆。在我的情況下promisesA會持有什麼數據?它是否包含所有的url和文件名?我需要提取這些值並將它們添加到數組中?如何使用promies在數組中收集這些數據? – user1788736

+0

而不是將函數添加到getJSON調用中,只需將該調用另存爲變量(例如promiseA)即可。一旦你保存了這個調用,promiseA將持有一個具有幾個函數的對象,最重要的一個是「完成」,你可以傳遞給完成函數一個接收JSON的回調方法。然而在我的例子中,因爲你想要返回幾個JSON,你可以使用$ .when來等待所有的promise完成,然後使用'.then'來獲得所有結果到同一個函數。 – Saar

+0

在jQuery API中查看https://api.jquery.com/jquery.when/ – Saar

相關問題