2012-08-02 84 views
0

我寫了一個函數來獲取各種詠歎調中的所有數據這樣的..Dojo:異步xhrGet返回 - undefined?

function retrieveData(dom_sclapi) { 
     var apiResponse; 
     dojo.xhrGet({ 
       url : dom_sclapi, 
       handleAs: handle, 
       //sync: true, 
       headers: { "Accept": "application/json" }, 
       preventCache: true, 
       //Success 
       load: function(Response) { 
         apiResponse = Response; 
       }, 
       // Ooops! Error! 
       error: function(Error, ioArgs) { 
         //apiResponse = Error; 
         //console.log(ioArgs.xhr.status); 
       } 
     }); 
     //apiResponse 
     return apiResponse; 
    } 

但apiResponse上同步(當我評論同步attrribute這裏)返回一個未定義= FALSE狀態。它的返回僅在sync = true時正確輸出數據。因此,這會導致加載樣式中的Chrome和IE出現問題,因爲Chrome和IE會阻止同步調用中的所有其他操作。

我該如何克服這種情況?我的代碼的實際問題是什麼?

+0

而不是返回響應,返回的內容dojo.xhrGet讓你回來 - 這就是遞延下面提到(。於是,.addCallbacks(SUCC功能,功能ERR)等),因此,如果你鉤了一個延期你也可以省去'load'和'error'參數 – mschr 2012-08-02 13:48:22

+0

如果你的console.log(Response)在你的負載中我敢打賭它正在得到你想要的。我看到的問題是範圍。您可能希望將加載函數的作用域綁定到調用上下文,因爲默認情況下它將在窗口上執行。 – Steve 2012-08-02 15:34:33

回答

3

您需要更好地理解同步和異步代碼背後的想法。

這正是它返回undefined的情況,因爲它不同步並且值尚不可用。 當您設置爲synchronized時,其餘代碼執行將等待函數返回,否則讓代碼繼續而不等待結果。

當你編寫異步代碼時,你不應該期望它會在下一行代碼中返回一個值,因爲它很可能不會。 而應該在返回值變爲可用時創建事件或回調。 在這種情況下,load:是一個回調,當請求收到響應時。

另請參閱有關Deferred對象的文檔。他們也描述在xhrGet

因此,你上面的代碼可能會變成這樣的東西。的

function retrieveData(dom_sclapi, callback) { 
     // Will return Deferred object 
     return dojo.xhrGet({ 
       url : dom_sclapi, 
       headers: { "Accept": "application/json" }, 
       preventCache: true, 
       // Pass callback function to do something with response 
       load: callback, 
       error: function(Error, ioArgs) { 
         //console.log(ioArgs.xhr.status); 
       } 
     }); 
    } 
// Or get data by deferred object 
retrieveData(url, null).then(function(Response){ /* Do something with response */ }) 
// Via callback 
retrieveData(url, function(Response){ /* Do something with response */ }); 
+0

感謝您的寶貴迴應...... leme玩這個... – Saidh 2012-08-02 11:52:29

+0

修復'handleAs',無需設置它,如果Response是一個實際的JSON字符串,只需調用'var object = dojo.eval(Response) '處理之前 – mschr 2012-08-02 13:45:32

+0

@mschr你是對的,謝謝 – 2012-08-02 15:29:35