2012-05-18 92 views
1

我看到PhoneGap出現了一些奇怪的行爲。 OnDeviceReady會觸發,但當我去使用「設備」變量時,它仍然是未定義的。我發現一些代碼,採訪了這一點,並說使用的setTimeout等待一秒鐘(再次,它說後的準備)實際使用的變量(如下圖):PhoneGap設備未準備好時觸發設備

setTimeout(function() { 
    MobileDevice = new MobiDevice(device); 
}, 1000); 

這似乎開始工作,但現在它看起來時間不確定。我最近不得不起來超時5000,這是我們當前的代碼:

setTimeout(function() { 
    console.log("starting setup"); 
    try { 
      MobileDevice = new MobiDevice(device); 

     console.log("created MobiDevice from a real device"); 
    } 
    catch (error) { 
     console.log("no device reference - mocking device"); 
     var d = { 
      platform: "Android", 
      version: 5 
     }; 

     MobileDevice = new MobiDevice(d); 
    } 

    console.log("device setup complete"); 
}, 5000); 

如果它確實的時間是不確定的都有些什麼戰略他人已經使用來解決這個問題的情況下。如果它不應該是不確定的,我可以在哪裏尋找修復。

在此先感謝

+2

PhoneGap的平臺和版本是什麼,因爲這聽起來像是一個bug。 –

回答

0

所以,這裏的答案是兩倍。其中一個是PhoneGap,它必須等待設備變量初始化,即使PhoneGap認爲設備已準備就緒。我使用setInterval並等待,直到我可以使用「設備」,然後將它傳遞給我的包裝。

另一塊是網頁。在我們的測試過程中,我們希望能夠嘲笑設備並放棄設備初始化,導致它不會發生。

if (navigator.platform.match(/(mac|win)/i)) { 
     console.log("on a browser, mocking the device"); 
     // we are on the browser 
     // you can manually set properties here to test for different devices 
     var d = { 
      platform: "Android", 
      version: 5 
     }; 

     MobileDevice = new MobiDevice(d); 
    } 
    else { 

現在,我們只關心iPhone和Android,因此如果我們只是navigator.platform,我們可以得到瀏覽器運行在什麼平臺上。這在Windows,iPhone,Android和Mac之間會有所不同。不同的,我們可以區分。如果我們決定支持WP,那麼必須改變這種情況,最有可能的是

1

我建議你使用輪詢。

setTimeout(function() { 
    if(device !== undefined) 
     MobileDevice = new MobiDevice(device); 
    else 
     setTimeout(arguments.callee, 1000); 
}, 1000); 

如果你願意,你可以與超時限制(這裏是1000毫秒),使得它減少每次調用後......你明白了吧脾氣。

+0

是的,我們現在正在用setInterval嘗試,直到我們擁有它。現在的問題是,我們什麼時候放棄,並假設我們在瀏覽器上。檢查導航器的JS對象 – xximjasonxx

+0

坦率地說,我從來沒有與phonegap或移動設備上工作...所以我對移動設備上的導航器沒有太多的想法...如果你能告訴我如何區分,那麼我可能會幫助你 –

相關問題