设备未准备就绪时,PhoneGap Device Ready将触发

时间:2012-05-18 15:24:24

标签: javascript cordova

我看到PhoneGap的一些奇怪行为。 OnDeviceReady会触发,但是当我使用“device”变量时,它仍然是未定义的。我找到了一些与此对话的代码,并说使用setTimeout等待一秒钟(再次,在它说好之后)实际使用变量(下面):

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 个答案:

答案 0 :(得分:1)

我建议你使用民意调查。

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

如果您愿意,您可以使用超时限制(此处为1000毫秒)进行调整,使其在每次通话后减少......您明白了。

答案 1 :(得分:0)

所以,这里的答案是双重的。一,PhoneGap就是这样,即使在PhoneGap认为设备准备好之后,你也必须等待设备变量初始化。我使用了setInterval并等到我可以使用'device'然后将它传递给我的包装器。

另一部分是网络。在测试期间,我们希望能够模拟设备并放弃设备初始化,因为它不会发生。

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,那么很有必要改变这一点,很可能是