Angular promise然后回调没有在chrome.storage.local.get上触发

Rob*_*ler 1 javascript dependency-injection google-chrome-extension angularjs

我正在玩角度和它的DI.我也尝试使用promises范例,但是我遇到了一个相当奇怪的问题,在Chrome扩展中使用它.

以下代码非常有效.当调用"chromeStorageService"中的对象文字中的cb()时,将解决promise.但是,当我取消注释返回时chrome.storage.local;,代码停止工作.我无法理解为什么,因为console.log('going to be resolved');仍然被解雇,但成功警报不会.在此先感谢任何提示:)

http://jsfiddle.net/Ku5dz/

https://developer.chrome.com/extensions/storage.html

'use strict';
var app = {};

app = angular.module('options', ['options.controllers']);

app.services = angular.module('options.services', []);


app.services.factory('chromeStorageService', function () {
    //return chrome.storage.local;


    return {
        get: function(id, cb) {
            cb();
        }
    }
});

app.services.factory('storageService', ['chromeStorageService', '$q', function (chromeStorage, $q) {
    return new function () {
        this.get = function (identifier) {
            var defered = $q.defer();

            chromeStorage.get(identifier, function (items) {
                var error = false//chrome.runtime.lastError;
                if (error) {
                    return defered.reject(error);
                }

                console.log('going to be resolved');
                console.log(defered);
                defered.resolve();
            });

            return defered.promise;
        }
    }
}]);

app.services.factory('fooService', ['storageService', function (testService) {
    return new function () {
        this.getAll = function () {
            var promise = testService.get('foo');
            console.log(promise);
            promise.then(
                function () {
                    alert('success');
                }, function () {
                    aler('err');
                }
            );
        }
    }
}]);


app.directive('foo', ['fooService', function (fooService) {
    return {
        restrict:'A',
        link:function (scope, elm, attrs, ctrl) {
            fooService.getAll();    
        }
    };
}]);


app.controllers = angular.module('options.controllers', ['options.services']);
Run Code Online (Sandbox Code Playgroud)

Iai*_*ain 6

Angular有自己的小事件循环事物.当你.resolve承诺时,进入Angular的队列.仅当Angular清除其队列时才会发生填充.

通常的做法是:

$scope.$apply(function() {
  promise.resolve(thing);
});
Run Code Online (Sandbox Code Playgroud)

当控制从你传递给它的函数返回到$ apply时,它会清除队列并且一切都很漂亮.在这种情况下,您可能需要将$ rootScope注入服务,以便您可以应用某些内容,因为AngularJS中的视图未更新.

你的存根工作,因为存根永远不会离开角度世界,所以你已经在一个将照顾队列的上下文中.使用chrome.storage.local时,不会从这样的上下文调用回调.