Javascript PhoneGap设备就绪在设备未就绪时触发

Javascript PhoneGap设备就绪在设备未就绪时触发,javascript,cordova,Javascript,Cordova,我在PhoneGap上看到了一些奇怪的行为。OnDeviceReady将启动,但当我使用“device”变量时,它仍然没有定义。我找到了一些与此相关的代码,并说使用setTimeout等待一秒钟(同样,在它说它准备好了之后)以实际使用变量(如下所示): 起初这似乎是可行的,但现在看来时间还不确定。我最近不得不将超时时间提高到5000。这是我们当前的代码: setTimeout(function () { console.log("starting setup"); try {

我在PhoneGap上看到了一些奇怪的行为。OnDeviceReady将启动,但当我使用“device”变量时,它仍然没有定义。我找到了一些与此相关的代码,并说使用setTimeout等待一秒钟(同样,在它说它准备好了之后)以实际使用变量(如下所示):

起初这似乎是可行的,但现在看来时间还不确定。我最近不得不将超时时间提高到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);
如果时间确实是不确定的,那么其他人使用了哪些策略来解决这个问题。如果它不应该是不确定的,我可以在哪些方面寻找修复


提前感谢

我建议您使用轮询

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

如果您愿意,您可以调整超时限制(这里是1000毫秒),这样每次调用后超时限制都会减少……您就明白了。

我建议您使用轮询

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

如果您愿意,您可以调整超时限制(这里是1000毫秒),这样每次通话后超时限制都会降低……您就明白了。

因此,这里的答案是双重的。首先,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,那么我们必须改变这一点,最有可能的答案是双重的。首先,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,那么我们必须改变这一点,最有可能的是

是的,我们现在正在尝试使用setInterval,直到我们拥有它。现在的问题是,我们什么时候放弃,并假设我们在浏览器上。检查navigator JS对象坦白地说,我从来没有在phonegap或移动设备上使用过navigator…因此我对移动设备上的navigator没有太多的了解…如果你能告诉我如何区分,那么我可能能够帮到你是的,我们现在正在尝试使用setInterval,直到我们有了它。现在的问题是,我们什么时候放弃,并假设我们在浏览器上。检查navigator JS Objects坦白地说,我从未在phonegap或移动设备上使用过navigator…因此我对移动设备上的navigator不太了解…如果您能告诉我如何区分,那么我可能能够帮助Ya了解phonegap的哪个平台和版本,因为这听起来像是一个bug。phonegap的哪个平台和版本是这样的听起来像个虫子。