Мое приложение зависает, хотя я использую обещание выполнить вычисления.Угловое обещание висит UI
Я пишу небольшую игру BlackJack в Angular. В этой игре я хочу отображать перестановки карт в нижней части моей игровой панели. Моя игровая плата быстро работает, когда я не вызываю метод getData()
(см. Ниже), который вычисляет перестановки. Но когда я звоню getData()
, мой пользовательский интерфейс зависает.
служба, где я заявляю и вернуть обещание выглядит следующим образом:
app.service('cardService', ['$q', 'myservice', 'calculation', function ($q, myservice, calculation) {
return {
getData: function() {
var defer = $q.defer();
myservice.setup_deck();
var cards = myservice.get_needed_cards(myservice.player_hand, myservice.static_deck);
// This is calculation-intensive
var dh_grouped = calculation.step1(cards);
var result = calculation.step2(dh_grouped);
defer.resolve(result);
return defer.promise;
}
};
}]);
Теперь я называю обещание в очень ванильным образом, как это:
// controller.js
$scope.display_calculations = function() {
cardService.getData().then(function(result){
$scope.calcs = result;
console.log('calculations successful');
});
console.log('this message shows before the one above');
};
// The relevant HTML
<td ng-repeat="c in calcs">{{c.result}}</td>
Для отладки, я удалил заявление $scope.calcs = result
, чтобы увидеть, если удаление их остановит мой UI от подвешивания:
cardService.getData().then(function(result){
console.log('calculations successful');
});
Вышеуказанный не работает. Мой пользовательский интерфейс все еще висит! Единственный способ, с помощью которого я мог предотвратить зависание пользовательского интерфейса, - это не позвонить getData()
.
Как я могу использовать угловые, чтобы мои дорогие операции не повесили интерфейс?
P.S. Я использую Angular 1.2.21 и даже пытаюсь использовать 1.5.x, но это тоже не сработало.
Где и как часто вызывается display_calculations? Если пользовательский интерфейс зависает только из одного вызова, проблема не связана с угловым, а с общим JS.Дорогостоящие вычисления должны быть либо сделаны асинхронными, либо перемещены в веб-рабочий, чтобы не блокировать основной поток. – estus
Да, я использовал $ timeout, и он работал как DerekMT ниже, и моя проблема исправлена. – Paul