2012-03-07 92 views
0

這聽起來像一個相當小巧的問題,但是到底是什麼。我坐在一個PhoneGap項目中,並遇到一些問題。 我跟着一個Ajax的小twitterfeed(http://wiki.phonegap.com/w/page/42450600/PhoneGap%20Ajax%20Sample)的教程,它的作品就像一個魅力。但是,我正在編寫一個用於登錄,註銷等的小API,並且我幾乎可以實現它的工作。PhoneGap上的Ajax不會返回值

我會解釋我的問題: 我設置了一個BOOL變量,「b」確定用戶是否登錄。

var b = Do_Ajax('isloggedin');

和功能看起來幾乎完全一樣:

function Do_Ajax(what) 
    { 
     var ajax = new XMLHttpRequest(); 

     if(what == "isloggedin") 
     { 
      ajax.open("GET", root() + "/?isloggedin",true); 
      ajax.send(); 
     } 

     //Get the results back   
     ajax.onreadystatechange=function() 
     { 
      if(ajax.readyState==4 && (ajax.status==200||ajax.status==0)) 
      { 
       eval('var data = ' + ajax.responseText + ';'); 
       var theResults = data.results;      
       if(data['BOOL'] != null) 
       { 
        return data['BOOL']; 
       } 
      } 
     } 
    } 

如果我現在嘗試在這個變量的警報(b)中,我得到「未定義」。如果我將「return」更改爲「alert」(我打印「返回數據['BOOL'];」 - php返回一個json字符串),我將得到真或假的值。如果我然後對函數中的b變量AND發出警報 - b變量首先發出警報,然後發出數據['BOOL']警報。

所以問題是函數在獲取數據之前返回undefined。我如何使函數「等待」返回這個值,直到它已經運行onreadystatechange的東西?

編輯:解決它的一種方法是聲明一個變量外的函數,如「var IsUserOnline = false;」然後在函數完成請求時設置「IsUserOnline = data ['BOOL']:」,稍後在代碼中使用這個變量。但是,我認爲迴歸思考是最好的。我想我的代碼在將來會非常混亂,當我通過這個函數獲取/發佈更多的東西時。也許這只是我的想法現在真的錯了?

回答

1

您可以在onreadystatechange函數中調用該函數。

在您的代碼(見我添加的註釋):

function Do_Ajax(what) 
    { 
     var ajax = new XMLHttpRequest(); 

    //Get the results back   
    ajax.onreadystatechange=function() 
    { 
     if(ajax.readyState==4 && (ajax.status==200||ajax.status==0)) 
     { 
      eval('var data = ' + ajax.responseText + ';'); 
      var theResults = data.results;      
      if(data['BOOL'] != null) 
      { 
       return data['BOOL']; 
      } 

      //CALL YOUR FUNCTION HERE, 
      //OR THE CODE WHAT NEEDS TO HAPPEN AFTER A VALUE HAS BEEN RECEIVED 
      //BY THE AJAX REQUEST 
     } 
    } 

    if(what == "isloggedin") 
    { 
     ajax.open("GET", root() + "/?isloggedin",true); 
     ajax.send(); 
    } 
} 
+0

嘿,謝謝你的回覆。但是我應該調用什麼函數?呼喚自己?在請求之後我想要發生什麼,Do_Ajax應該返回數據['BOOL']的值。現在它只是返回undefined,因爲它在onreadystatechange東西運行之前返回一個值。 – Linus 2012-03-07 13:10:20

+0

我想你應該調用一個不同的函數。您初始化ajax請求,並在onreadystate中將您希望運行的代碼放入ajax結果中。 - 你也可以嘗試在onreadystatechange之後放置'if(logged_in)'部分。 – Jozzeh 2012-03-09 08:24:20

+1

看到我編輯的回覆(替換爲「if-isloggedin」 – Jozzeh 2012-03-09 12:25:17

0

如果我明白正確的您要撥打同步Ajax調用,但給定函數依然採用異步方式,因此您將不會收到正確的數據。試試jQuery AJAX promise函數,它可以幫助你調用ajax請求是同步模式。

http://www.erichynds.com/jquery/using-deferreds-in-jquery/

http://intridea.com/posts/fun-with-jquery-deferred

如果你不使用jQuery,那麼你可能需要what後添加callback參數,並呼籲響應處理回調。

+0

嘿,謝謝你的回覆。你能給我看一個回調的例子嗎? – Linus 2012-03-09 13:31:06

+0

我把這個例子放在這個小提琴中http://jsfiddle.net/dhavaln/6QkWg / – dhaval 2012-03-09 14:26:06