Javascript 然后回调不在chrome.storage.local.get上启动

Javascript 然后回调不在chrome.storage.local.get上启动,javascript,dependency-injection,google-chrome-extension,angularjs,Javascript,Dependency Injection,Google Chrome Extension,Angularjs,我只是在玩angular和它的DI。我也尝试使用promises范例,但是我遇到了一个相当奇怪的问题,在Chrome扩展中使用它 下面的代码工作得很好。当调用“chromeStorageService”中的对象文本中的cb()时,承诺被解析。 但是当我取消注释返回chrome.storage.local时代码停止工作。我不明白为什么,因为console.log('即将解决')仍会被触发,但成功警报不会被触发。提前感谢您提供的任何提示:) 如果在get之前取消对return的注释,那么除了ge

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

下面的代码工作得很好。当调用“chromeStorageService”中的对象文本中的cb()时,承诺被解析。 但是当我取消注释返回
chrome.storage.local时代码停止工作。我不明白为什么,因为
console.log('即将解决')仍会被触发,但成功警报不会被触发。提前感谢您提供的任何提示:)


如果在get之前取消对return的注释,那么除了get调用之外,您如何进行调用

基本上,当你返回“某物”时,你就失去了功能

在angular js中,可以使用以下语法调用then函数

    $http.get(url).then(function(response){
           //put your callback code here
       }) 

如果在get之前取消对return的注释,那么除了get调用之外,您如何进行调用

基本上,当你返回“某物”时,你就失去了功能

在angular js中,可以使用以下语法调用then函数

    $http.get(url).then(function(response){
           //put your callback code here
       }) 

基本上,您的代码没有运行是因为您返回了chrome.local.storage,这会将您带出作用域,而get函数永远不会得到执行的机会。请参阅chrome API,了解如何实现这一点。它与angular的$http服务非常相似。基本上,您的代码之所以没有运行,是因为您返回了chrome.local.storage,它会将您带出范围,而get函数永远没有机会执行。请参阅ChromeAPI,了解如何实现这一点,它与angular的$http服务非常相似,angular有自己的小事件循环。当你
.resolve
一个承诺时,它进入Angular的队列。只有当Angular清除其队列时,才会发生填充

通常的做法是:

$scope.$apply(function() {
  promise.resolve(thing);
});
当控件从传递给它的函数返回$apply时,它会清除队列,一切都很好。在这种情况下,您可能需要向服务中注入$rootScope,这样您就可以应用一些东西,如所示


您的存根可以工作,因为存根永远不会离开有角度的世界,所以您已经处于一个将管理队列的上下文中。当您使用chrome.storage.local时,您的回调不会从这样的上下文中调用。

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

通常的做法是:

$scope.$apply(function() {
  promise.resolve(thing);
});
当控件从传递给它的函数返回$apply时,它会清除队列,一切都很好。在这种情况下,您可能需要向服务中注入$rootScope,这样您就可以应用一些东西,如所示


您的存根可以工作,因为存根永远不会离开有角度的世界,所以您已经处于一个将管理队列的上下文中。当您使用chrome.storage.local时,您的回调不会从这样的上下文中调用。

我今天遇到了同样的问题。我想与Angular promise模式集成,因为chrome.storage.local.get是异步函数。我就是这么做的:

// service
angular.module('app').factory('STORAGE', function($q) {
    return {
        get: function(key) {
            var deferred = $q.defer();

            chrome.storage.local.get(key, function(data) {
                deferred.resolve(data[key]);
            });

            return deferred.promise;
        },
        set: function(key, value) {
            var deferred = $q.defer();

            var data = {};
            data[key] = value;
            chrome.storage.local.set(data, function() {
                deferred.resolve({});
            });

            return deferred.promise;
        },
        del: function(key) {
            var deferred = $q.defer();

            chrome.storage.local.remove(key, function() {
                deferred.resolve({});
            });

            return deferred.promise;
        }
    }
});
我定义了一个角度服务调用
STORAGE
,可以封装chrome.STORAGE.local<代码>获取
设置
删除
方法

然后我们可以将
存储
注入到角度路由
解析
部分

// route resolve
...
resolve: {
    hasToken: function(STORAGE) {
        return (STORAGE.get('instagram_access_token')) ? true : false;
    }
}
...
将路由解析参数和
存储注入控制器

// controller 
angular.module('app').controller('HomeController', ['$scope', 'hasToken', 'STORAGE',
    function($scope, hasToken, STORAGE) {
        $scope.hasToken = hasToken;

        if ($scope.hasToken) {
            STORAGE.get('profile').then(function(data) {
                $scope.user = data;
            });
        }
    }
]);

它确实很管用

我今天遇到了同样的问题。我想与Angular promise模式集成,因为chrome.storage.local.get是异步函数。我就是这么做的:

// service
angular.module('app').factory('STORAGE', function($q) {
    return {
        get: function(key) {
            var deferred = $q.defer();

            chrome.storage.local.get(key, function(data) {
                deferred.resolve(data[key]);
            });

            return deferred.promise;
        },
        set: function(key, value) {
            var deferred = $q.defer();

            var data = {};
            data[key] = value;
            chrome.storage.local.set(data, function() {
                deferred.resolve({});
            });

            return deferred.promise;
        },
        del: function(key) {
            var deferred = $q.defer();

            chrome.storage.local.remove(key, function() {
                deferred.resolve({});
            });

            return deferred.promise;
        }
    }
});
我定义了一个角度服务调用
STORAGE
,可以封装chrome.STORAGE.local<代码>获取
设置
删除
方法

然后我们可以将
存储
注入到角度路由
解析
部分

// route resolve
...
resolve: {
    hasToken: function(STORAGE) {
        return (STORAGE.get('instagram_access_token')) ? true : false;
    }
}
...
将路由解析参数和
存储注入控制器

// controller 
angular.module('app').controller('HomeController', ['$scope', 'hasToken', 'STORAGE',
    function($scope, hasToken, STORAGE) {
        $scope.hasToken = hasToken;

        if ($scope.hasToken) {
            STORAGE.get('profile').then(function(data) {
                $scope.user = data;
            });
        }
    }
]);

它确实很管用

chrome.storage.local还提供了一个名为“get”的方法,该方法调用给定的回调。我的object literal只是模仿这种行为。或者我错过了什么?chrome.storage.local还提供了一个名为“get”的方法,该方法调用给定的回调。我的object literal只是模仿这种行为。或者我遗漏了什么?我有同样的问题:调用$scope中的函数并从指令返回一个承诺,并没有在指令中触发then()。令我惊讶的是,你的伎俩居然奏效了。我将resolve()和reject()封装在$apply中,一切正常。您是否参考过解释原因的文档?我觉得这很难看,我想确保在使用$q和Angular时没有做一些不自然的事情。也许我不应该从指令调用延迟函数到$scope?这是一篇相当不错的文章。谢谢,这篇文章很好。我认为我的问题不在于延迟的实现本身,而在于我正在一个非角度异步回调中解决它(我很懒,使用$.ajax是为了舒适)。我将尝试切换到角度等效项,我希望它能将回调封装到$scope中。$apply()为我简化语法。我遇到了相同的问题:在$scope中调用函数并从指令返回承诺,但在指令中没有触发then()。令我惊讶的是,你的伎俩居然奏效了。我将resolve()和reject()封装在$apply中,一切正常。您是否参考过解释原因的文档?我觉得这很难看,我想确保在使用$q和Angular时没有做一些不自然的事情。也许我不应该从指令调用延迟函数到$scope?这是一篇相当不错的文章。谢谢,这篇文章很好。我认为我的问题不在s