Chrome扩展和Angular:我可以把Chrome.runtime.sendMessage变成一个同步函数吗

Chrome extension and Angular: Can I turn chrome.runtime.sendMessage into a synchronous function?

本文关键字:Chrome 一个 函数 同步 Angular 扩展 我可以 runtime sendMessage      更新时间:2023-09-26

我正在尝试运行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');
    }
  });

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

但是,您可以通过使用promise使异步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;
})