2013-03-02 24 views
0

我正在嘗試一下面向對象的jQuery,但我並沒有走得太遠。 我創建了兩種方法;jQuery Mobile功能不返回(OO)

  • DoConnect - > AJAX請求檢查URL是否可用。 callback(true)如果連接成功,callback(false)如果它 失敗。
  • Connect - >從哪裏調用它需要被調用。

什麼行得通?

DoConnect嘗試連接到主機併發送callback。這工作得很好。 Connect讀這個callback,也工作正常。 (我測試了這個,加入alert返回callback的布爾值)

什麼不?

好,Connect讀取callback並有return值到它被稱爲擺在首位。

我的代碼到目前爲止

的類和方法Connect

var Class = 
{ 
    Connect : function(host, apikey) 
    { 
     var returnVal; 

     DoConnect(host, apikey, function(res) 
     { 
      if (res) 
      { 
       // alert('TRUE'); 
       returnVal = true; 
      } 
      else 
      { 
       // alert('FALSE'); 
       returnVal = false; 
      } 
     }); 

     return returnVal; 
    } 
} 

DoConnect的方法

var DoConnect = function(host, apikey, callback) 
{ 
    $.ajax({ 
     type: 'GET', 
     url: host + "/api?do=ping&" + apikey, 
     dataType: 'jsonp', 
     success: function(e) 
     { 
      if (e.status != undefined) 
      { 
       callback(false); 
      } 
      else 
      { 
       callback(true); 
      } 
     } 
    }); 
} 

我這樣稱呼它;

var IsConnected = Class.Connect(host, apikey); 
alert(IsConnected) // Returns undefined. 

Chrome的調試控制檯沒有返回錯誤。 我在這裏做錯了什麼?

回答

1

您的returnVal會在答案出現之前返回。返回值是異步的,你必須保持整個鏈的異步。

您需要添加一個回調到Connect功能太像:

Connect : function(host, apikey, callback) 

然後調用DoConnect功能的回調內部的回調:

 if (res) 
     { 
      // alert('TRUE'); 
      return callback(true); 
     } 
     else 
     { 
      // alert('FALSE'); 
      return callback(false); 
     }  

你可以打電話給你功能,然後像:

Class.Connect(host, apikey, function(returnValue) { 
    alert(returnValue); 
}); 
+0

完美。我正在考慮整個呼叫是異步可能形成的問題,但我不知道修復是如此簡單。謝謝。 – Roel 2013-03-02 09:20:51

0

您需要等待ajax調用fi在返回價值之前。這可以通過將async選項設置爲false來完成,比如...哦,等等,不,它不能。

the docs

跨域請求和數據類型: 「JSONP」 請求不支持同步操作。

好了,所以我們要做一個良好的老式投票循環:

... // after $.ajax call 
while(typeof(returnVal) === "undefined"); 

return returnVal; 

它具體擊敗(在「AJAX」的第一個「A」)jQuery的調用的異步特性,但如果這是你需要的功能,這將會讓你在那裏。