Расширение 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;
})