Chrome扩展程序和Angular:我可以将chrome.runtime.sendMessage转换为同步功能吗?

时间:2015-03-27 04:20:45

标签: javascript angularjs google-chrome google-chrome-extension

我正在尝试运行chrome.runtime.sendMessage以从服务器获取信息。我正在使用此信息来确定在我的Chrome扩展程序中显示哪个页面。问题是chrome.runtime.sendMessage是一个异步函数,它与app.config没有很好的相符。有没有办法可以将chrome.runtime.sendMessage变成同步函数?

app.config(function($stateProvider, $urlRouterProvider) {
  var rootRef = new Firebase(some url);
  var user = rootRef.getAuth();
  chrome.runtime.sendMessage({action: 'isDrawing'},function(res) {
    if (!user) { 
      $urlRouterProvider.otherwise('/login');
    } else if (res.isDrawing === 'true') {
      $urlRouterProvider.otherwise('/draw');
    } else {
      $urlRouterProvider.otherwise('/main');
    }
  });

1 个答案:

答案 0 :(得分:0)

您的问题的答案是否定的,您不能将异步函数转换为同步函数。可以找到详细的解释here

但是你可以通过使用promises使异步api更友好。以下是存储服务的示例:

angular
    .module('core.services')
    .service('chromeStorageService', ['$q', function($q) {
        var $key = 'UniqueKey';

        this.loadState = function() {
            var deferred = $q.defer();

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

            return deferred.promise;
        };
    }]);

然后你可以使用这样的服务:

storageService.loadState().then(function (state) {
    // do something with your state;
})