我有一个由XHR填充的JSON对象。然后,我需要使用来自单独XHR调用的值更新该对象。我遇到的问题是第二次调用没有在正确的时间进行,我认为这是我如何构建我的对象的问题。这就是我所拥有的:
function Proprietary()
{
var proprietary= this;
this.Groups = {};
this.getGroups = function()
{
$.getJSON(group_url, function(data){proprietary.callReturned(data);});
}
this.callReturned = function(data)
{
//Do stuff
for(var i=0; i< data.groups.length; i++)
{
insparq.Groups[i] = data.groups[i];
$.getJSON(participant_url, function(p){proprietary.Groups[i].participants = p;});
}
//the function call below is the action I want to occur after the object is populated.
PopulateGroups();
}
};
答案 0 :(得分:1)
该代码段中似乎有许多奇怪的东西。
首先,$ .getJSON(...)接受第三个参数,即你的回调。第二个参数是数据。我认为您将函数作为数据参数传递。你需要在两个地方解决这个问题。如果您不需要传递任何内容,只需将第二个参数设为空对象{}。
这是在所有XMLHttpRequests从服务器返回后执行回调的一种通用方法。
this.callReturned = function(data) {
var countdown = data.groups.length;
function callback() {
if(countdown-- === 1) {
PopulateGroups();
}
}
for(var i=0; i< data.groups.length; i++)
{
insparq.Groups[i] = data.groups[i];
$.getJSON(participant_url, { /* data to send to server */ }, callback);
}
}
在此代码段中,每次从服务器返回XMLHttpRequest时都会执行回调函数。在倒数从data.groups.length下降到1之后,最后一个执行PopulateGroups()。