Javascript JSON对象XHR和闭包
我有一个由XHR填充的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.
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调用会在浏览器尝试获取数据时锁定浏览器-这不是一个好主意