2012-05-18 55 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或移动设备上工作...所以我对移动设备上的导航器没有太多的想法...如果你能告诉我如何区分,那么我可能会帮助你 –

相关问题