Расширение Chrome и Angular: можно ли превратить chrome.runtime.sendMessage в синхронную функцию?

Я пытаюсь бежать 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 ответ

Ответ на ваш вопрос - нет, вы не можете превратить асинхронную функцию в синхронную. Подробное объяснение можно найти здесь

Однако вы можете сделать async 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;
})
Другие вопросы по тегам