AngularJS/Cordova: deviceready 后如何在工厂中获取值?

AngularJS/Cordova: How can I get values in my factory after deviceready?

我正在尝试使用 Cordova Device 插件来获取有关用户正在使用的设备的信息。文档说它只能在 deviceready 函数之后调用,所以在我的 .run 函数中我有以下内容:

.run(function($rootScope, $state, $stateParams) {

    document.addEventListener('deviceready', onDeviceReady, false);

    function onDeviceReady() {
        console.log(device);
    }

 //more functions below

效果很好,我在控制台中看到了设备对象,但我真正想要的是在工厂内部使用设备对象,有时会在 deviceready 事件之前调用它。

所以我的问题是如何让 make device 对象在我的工厂可用时可用?我想要类似下面的代码

angular.module('myapp.services.myFactory', [])

.factory('MyFactory', function($q) {

    function getDevice () {
        //if the deviceready event happend and I can access the device object set to variable
        return device;
    }

    return {
        getDeviceInfo: function getDeviceInfo() {
            return $q(function(resolve, reject) {
                if (getDevice()) {
                    //do something with the device object 
                } else {
                   //do something without device object
                }
            });
        }
    };
});

无需在此处利用 .run - 您应该能够执行 deviceready 中的所有内容,包括您的模块和工厂定义。只需将所有内容都包含在这个事件中。我也不相信你需要 $q 来解决任何承诺。观察以下简化模式...

function onDeviceReady() {
    // guessing your dependency architecture
    angular
        .module('myapp', ['myapp.services'])
        .module('myapp.services', ['myapp.services.myFactory'])
        .module('myapp.services.myFactory', [])
        .factory('MyFactory', function() {

            function withDevice() {
                /*...*/
            }

            function withoutDevice() {
                /*...*/
            }

            return {
                // turnary. device always available to examine at this point
                'getDeviceInfo': device ? withDevice : withoutDevice
            }
        });
}

document.addEventListener('deviceready', onDeviceReady, false);