我正在尝试将几个url作为文本读入,并使用jquery的ajax / get将它们存储到数组中。我需要等待获取所有数据(并推送到数组),然后在函数中返回它。从我在网上看到的,这是不可能的。
我想如果我设置一个全局数组变量并在每次获得新数据时将其推入,那么如果数组已经饱和,则返回时使用while循环进行检查。见下文
您可以假设所有错误都在get
电话
function fetchData(){
x = [1,2,3,4,5,6,7,8,9,10];
a = [];
//Loop, get and push data
$.each(x, function( i, val ) {
$.get("http://someurl/"+i, function( data ) {
a.push(data);
});
});
// Wait till our array is populated?
while(a.length < x.length){
console.log(a.length);
}
return a;
}
然而,这种方法似乎没有起作用,并且没有任何东西被添加到数组中。 有人能指出我正确的方向吗?
谢谢
答案 0 :(得分:3)
您正在寻找的解决方案是使用回调
function fetchData(callback) {
var requests = [];
for (var i = 1; i <= 10; i++) {
requests.push($.get("http://someurl/" + i))
}
$.when.apply($, requests).then(function () {
var array = $.map(arguments, function (arg) {
return arg[0];
});
callback(array);
})
}
fetchData(function (array) {
//do something with array
})
PoC:Fiddle
答案 1 :(得分:2)
即使在回调被触发之前,您在结果数组上执行console.log
。因此数组a
将始终为空。您要做的是在处理数组console.log
中的所有值后触发x
。
您正在尝试返回结果数组。相反,您应该尝试获取在回调中处理a
的代码。
像
function fetchData(cb){
x = [1,2,3,4,5,6,7,8,9,10];
a = [];
//Loop, get and push data
$.each(x, function( i, val ) {
$.get("http://someurl/"+i, function( data ) {
a.push(data);
if(a.length == x.length) {
//looping logic taken inside callback
while(a.length < x.length){
console.log(a.length);
}
//calling the callback on result
cb(a);
}
});
});
}
fetchData(function(data){
//process a here
});
答案 2 :(得分:1)
通过这种方式,您无法确保ajax调用将同步完成。为此,您可以进行正常的ajax调用,也可以使用ajaxSetup。
通过这些方式,您可以确保在处理完所有调用后读取数组。你也最好有一个超时,因为有些电话可能无法及时返回。