Javascript 如何仅在所有getjson调用完成时将对象数组传递给另一个函数?
我必须进行一些getjson调用,从google电子表格中获取一些数据,并将所需数据存储到一个数组中,过滤数组并显示数据。我当前的代码在第一个getjson完成之前有一段时间会传递数组中的大量数据,因此数组中的数据不完整 在将数组传递给另一个函数之前,是否有一种方法可以让我的上一个getjson仅在所有之前的getjson调用完成(包括它本身)时才将数组发送给另一个函数Javascript 如何仅在所有getjson调用完成时将对象数组传递给另一个函数?,javascript,arrays,ajax,getjson,Javascript,Arrays,Ajax,Getjson,我必须进行一些getjson调用,从google电子表格中获取一些数据,并将所需数据存储到一个数组中,过滤数组并显示数据。我当前的代码在第一个getjson完成之前有一段时间会传递数组中的大量数据,因此数组中的数据不完整 在将数组传递给另一个函数之前,是否有一种方法可以让我的上一个getjson仅在所有之前的getjson调用完成(包括它本身)时才将数组发送给另一个函数 <script> var files = new Array();
<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 promiseA = $.getJSON(urla..);
var promiseB = $.getJSON(urlb..);
$.when(promiseA, promiseB).then(function(resultA,resultB){
//do whatever you want with results.
});
编辑:这是您编辑的代码,可能是var entry=…
的问题,如果是这样的话,请查看调试中的entry1和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);
});
});
谢谢你的回复。就我而言,promisesA将持有哪些数据?它是否保存所有URL和文件名?我需要提取这些值并将它们添加到数组中?如何使用Promise在数组中收集这些数据?与其在getJSON调用中添加函数,不如将调用保存为变量(例如promiseA)。保存该调用后,promiseA将保存一个具有多个函数的对象,最重要的一个是“done”,您可以向done函数传递一个接收JSON的回调方法。然而,在我的示例中,因为您希望返回多个JSON,所以您使用$。当它等待所有承诺完成时,然后您使用
。然后将所有结果返回到同一个函数;内置when函数,但没有数据附加!在我继续之前,我想看看promisesA的内容是什么……做这个promiseA.done(function(res){$(“#tblentatattributes tbody”).append(res)})代码>顺便说一句,如果您只需要上面我给您的代码,并且代码上写着//do what you want you append resultA and resultB to element,您将看到这两个结果
var promiseA = $.getJSON(urla..);
var promiseB = $.getJSON(urlb..);
$.when(promiseA, promiseB).then(function(resultA,resultB){
//do whatever you want with results.
});
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);
});
});