2013-10-01 51 views
1

道場獲取變量從服務器和存儲數據,我有以下功能:使用xhrGet

loadMsgBody: function (id) { 
    return dojo.xhrGet({ 
     url: "myurl", 
     handleAs: "text", 
     content: { 
      id: id 
     }, 
     load: function (response) { 
      return response; 
     }, 
     error: function (response) { 
      alert(response); 
     } 
    }); 
} 

,把它:

var text = ""; 
this.loadMsgBody(this.msgId).then(function (response) { 
    text = response; 
}); 

現在我希望得到函數的返回值但相反,我獲得了一個空的文本值。但是,在Firebug中,我確實看到服務器的響應值正確。我已經搜索並找到這些鏈接:DOJO xhrGet how to use returned json object? 和: Using hitch/deferred with an xhrGet request 但我仍然無法使用上面的代碼獲取和存儲數據。我不想在xhrGet調用中進行操作,我想檢索數據並使用,因爲它將被多次使用。

有什麼我失蹤?

+0

你在Firebug得到什麼,當你調用'VAR MYDATA的= this.loadMsgBody(this.msgId);'?你可以在你的函數回調中爲'then'設置一個斷點,並注意分配了什麼'text'。 – Bucket

+0

我得到'[object Object]'。但在螢火蟲中,我看到服務器預期數據的響應。 – zulq

+0

'load'回調中'response'的值是多少?它看起來像一些對象正在轉換成一個字符串,可能這不是你想要的。 –

回答

0

試試這個:

loadMsgBody: function (id, callback) { 
    return dojo.xhrGet({ 
     url: "myurl", 
     handleAs: "text", 
     content: { 
      id: id 
     }, 
     load: function (response) { 
      callback.apply(null,[response]); 
     }, 
     error: function (response) { 
      alert(response); 
     } 
    }); 
} 

然後:

var text = ""; 
this.loadMsgBody(this.msgId, function (response) { 
    text = response; 
    console.log("text:",text); // this will show your return data 

}); 

console.log("text:",text); // this will show empty data because ajax call is asynchrize, at this time , data not return yet. 

setTimeout(function(){ 
    console.log("text:",text); // this will show your return data again because ajax call should have finished after 30000 ms 
},30000) 
+0

這會返回文本的空白數據,但對預期數據的響應不錯。 – zulq

+0

我不知道你在哪裏使用'文本'變量?你需要確保你在使用ajax獲取數據之後使用它,看看我的更新代碼。 –

+0

這就是使用的目的,但即使這樣也不適用於分配值。您可以在then函數中獲取值,但即使分配它,也會得到空數據。 – zulq

0

Dojo的XHR方法返回類dojo/Deferred的情況下,因爲它們是異步的。這意味着函數在響應值可用之前返回。爲了處理異步響應的結果,您需要等待它返回。 Dojo使用統一的API Deferreds公開這一點。 dojo/Deferred類的實例有一個方法then。方法then將函數作爲參數。該功能將在Deferred解決後執行(在這種情況下,請求完成時)。

var deferred = loadMsgBody(); 
deferred.then(function(response){ 
    //work with response 
}); 
0

我會試着改變你的load功能,喚起你的callback功能:

loadMsgBody: function (id, callback) { 
    return dojo.xhrGet({ 
     url: "myurl", 
     handleAs: "text", 
     content: { 
      id: id 
     }, 
     load: function (response) { 
      if(callback) { 
       callback(response); 
      } 
     }, 
     error: function (response) { 
      alert(response); 
     } 
    }); 
}