处理并发的xmlhttprequest

Handling Concurrent xmlhttprequests

本文关键字:xmlhttprequest 并发 处理      更新时间:2023-09-26

在一个函数中,我想使用xmlhttprequest下载三个资源;加载后,我想使用上述请求的响应来调用一个函数。然而,当我尝试调用该函数时,所需的上述响应是未定义的。

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
};

代码不工作,需要一些改进!

最后一部分:var DDM =引擎({"文件":文件,"元":元})返回DDM

将总是产生undefined,因为在这一点上,FileMeta可能还没有被分配任何东西,因为xmlhttprequest可能还没有返回。换句话说,它们的.onload()函数还没有被调用,因此File/Meta还没有被定义。

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

我解决了…这并不难……只要有一点想象力

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);
    }
};