2009-08-27 101 views
0

我正在做一些使用JS undefined AIR的開發。我想要做的是創建一個遠程網站的請求(例如用於身份驗證)。如何從正確的JS範圍返回變量?

問題不是AIR相關的,這是一個JS我不能正確的事情。我想要做的是檢索請求主體,但如果我只是返回「str」var它顯示「未定義」。我試圖在函數內部聲明它'全局',但它不起作用。我猜測有一些範圍問題,我忽略了。

 function doRequest(url){ 
      var req = new XMLHttpRequest(); 

      req.onreadystatechange = function(){ 
       if (req.readyState == 4) { 
        var str = req.responseText; 
        runtime.trace("deRequest result: " + str); 

         return str; 
       } 
      }; 
      req.open('GET', url, true); 
      req.send(null); 
     } 
+0

不是你正在尋找的答案,但我強烈建議你看看一個JavaScript庫來抽象出XMLHttpRequest - 比如jQuery,YUI或者原型。 – Magnar 2009-08-27 14:52:15

+0

我在我的AIR項目中使用jQuery,但似乎通常的jQuery方法(get,post,ajax)在AIR下無法正常工作。也許情況並非如此,如果有的話請讓我知道!謝謝 – Brayn 2009-08-27 14:53:24

回答

2

你不應該試圖捕獲onreadystatechange函數的返回值。 XHR是異步的,這意味着只有在請求完成時纔會觸發此代碼。所以你必須準備好在你的迴應裏面做那個功能。最簡單的事情就是傳入一個回調函數。

function doRequest(url, callback_func){ 
     var req = new XMLHttpRequest(); 

     req.onreadystatechange = function(){ 
      if (req.readyState == 4) { 
       var str = req.responseText; 
       runtime.trace("deRequest result: " + str); 

       callback_func(str); 
      } 
     }; 
     req.open('GET', url, true); 
     req.send(null); 
    } 

    function callback_func(data) { 
     // do something with your response data 
    } 
1

你將它返回給調用者onreadystatechange,這可能不感興趣。你也不能在doRequest的末尾返回它,因爲在調用req.send(null)之後它會立即返回並且該值尚不可用(仍然可以從服務器獲得)。一段時間後,你的onreadystatechange處理程序被調用,你有價值。在這一點上,沒有任何用處可以回到它。

您需要構造代碼,以便代替return str,您可以隨心所欲地處理返回值 - 例如,將它存儲在某個地方,使用alert顯示它,將它傳遞給另一個函數。