1

我从 PhoneGap 看到了一些奇怪的行为。OnDeviceReady 会触发,但是当我使用“设备”变量时,它仍然是未定义的。我找到了一些与此相关的代码,并说使用 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);

如果确实是时间不确定的情况,那么其他人使用了哪些策略来解决这个问题。如果它不应该是不确定的,我可以在哪里寻找修复。

提前致谢

4

2 回答 2

1

我建议你使用轮询。

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

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

于 2012-05-18T15:30:04.270 回答
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,那么很可能必须改变这一点

于 2012-05-18T19:33:50.903 回答