JSON对象XHR和闭包

时间:2010-12-13 06:37:01

标签: javascript json closures xmlhttprequest

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

};

1 个答案:

答案 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()。