2013-03-06 92 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); 
    } 
};