2013-03-06 55 views
-2

在单个函数中,我想使用xmlhttprequests下载三个资源;当他们被加载时,我想使用上述请求的响应来调用一个函数。但是,当我尝试调用函数时,上述所需的响应未定义。处理并发xmlhttprequests

function(){ 
var File=null 
var Meta=null 
var Engine=null 
var xhrFile = new XMLHttpRequest() 
var xhrMeta = new XMLHttpRequest(); 
var xhrEngine = new XMLHttpRequest(); 
xhrFile.open('GET','/archive/file.txt',true) 
xhrMeta.open('GET','/template/file.js',true) 
xhrEngine.open('GET','/javascript/app/hemp/engine.js',true) 
xhrFile.responseType='arraybuffer'; 
xhrMeta.responseType='text'; 
xhrEngine.responseType='text'; 
xhrFile.onload = function(){File=xhrFile.response} 
xhrMeta.onload = function(){File=eval(xhrMeta.response)}  
xhrEngine.onload = function(){Engine=eval(xhrEngine.response)} 
xhrFile.send(); 
xhrMeta.send(); 
xhrEngine.send(); 
var DDM=Engine({'file':File,'meta':Meta}) 
return DDM 
}; 

该代码不起作用,需要一些改进!

+4

Stack Overflow是询问编程的问题,不只是要求人们*修复*您对您的代码。 – 2013-03-06 08:05:25

+0

也许你必须改进你的符号学..他们看起来太紧 – kurro 2013-03-06 08:08:42

+1

请添加“代码不起作用”的详细信息。还要尽量让你的代码更加一致(变量名大写,分号的使用) - 当前的示例显示在你身边缺乏努力,这在这里并不受欢迎。 – 2013-03-06 08:17:05

回答

0

最后一部分: VAR DDM =引擎({ '文件':文件, '元':元}) 回报DDM

总是会产生不确定的,因为在这一点上,文件可能尚未分配任何内容,因为XMLHttpRequests可能尚未返回。换句话说,他们的.onload()函数还没有被调用,因此File/Meta还没有被定义。

你想要做的是在onload()中,检查File和/或Meta以查看它们是否被定义(即它们的XMLHttpRequests已成功返回)。如果是,那么你可以调用Engine({'file':File,'meta':Meta}),因为在那时它们就存在。

+0

是的,我确实包含了一个触发器,用于根据每个onload listener中三个变量的状态来调用该函数。 – kurro 2013-03-06 08:59:09

0

我解决它......这是不难想象......只是一点点

var solve = function(File,Meta,Engine){ 
    var DDM=Engine({'file':File,'meta':Meta}); 
    return DDM; 
}; 


//code added to the onload listeners 
xhrFile.onload = function(){ 
    File=xhrFile.response; 
    if (File && Meta && Engine){ 
     return solve(File,Meta,Engine); 
    } 
}; 
xhrMeta.onload = function(){ 
    Meta=eval(xhrMeta.response); 
    if (File && Meta && Engine){ 
     return solve(File,Meta,Engine); 
    } 
}; 
xhrEngine.onload = function(){ 
    Engine=eval(xhrEngine.response); 
    if (File && Meta && Engine){ 
     return solve(File,Meta,Engine); 
    } 
};