Javascript JSON对象XHR和闭包

Javascript JSON对象XHR和闭包,javascript,json,closures,xmlhttprequest,Javascript,Json,Closures,Xmlhttprequest,我有一个由XHR填充的JSON对象。然后,我需要使用来自单独XHR调用的值更新该对象。我遇到的问题是第二次调用没有在正确的时间进行,我认为这是我如何构建对象的问题。以下是我所拥有的: function Proprietary() { var proprietary= this; this.Groups = {}; this.getGroups = function() { $.getJSON(group_url, function(data){proprietary.

我有一个由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();
  }

};
函数专有()
{
var专有=此;
this.Groups={};
this.getGroups=函数()
{
$.getJSON(组url,函数(数据){propertial.callReturned(数据);});
}
this.callReturned=函数(数据)
{
//做事
对于(var i=0;i
该代码片段中似乎有一些奇怪的东西

首先,$.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);
    }

}
this.callReturned=函数(数据){
var倒计时=data.groups.length;
函数回调(){
如果(倒计时--==1){
populategroup();
}
}
对于(var i=0;i

在这个代码段中,每次从服务器返回XMLHttpRequest时都会执行回调函数。最后一个执行PopulateGroups(),在倒计时从data.groups.length下降到1之后。

我认为在名为
propertial
的函数中命名名为
propertial
的变量可能会引起一些问题,你不认为吗?
PopulateGroups
在所有
$.getJSON之前被调用(参与者url…
是。您需要使用外部计数器检查加载的参与者数量,并对照
$.getJSON中的
专有.Groups
的大小进行检查(participant_url…
回调函数,只有当它们相等时,才应调用
PopulateGroup
。谢谢你,Horia。在哪里/如何增加计数器?你可以使用
$.ajax
而不是
$.getJSON
,因为你可以设置
异步:false
来启用同步ajax调用,这将立即解决你的问题ely。@Kevin使用同步ajax调用会在浏览器尝试获取数据时锁定浏览器-这不是一个好主意