Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Promise как сделать синхронным? (https://javascript.ru/forum/angular/54937-promise-kak-sdelat-sinkhronnym.html)

FireVolkhov 07.04.2015 13:42

Promise как сделать синхронным?
 
Доброго времени суток, форумчане,
Как выйти из ситуации
$q.when()
  .then ->
    if allItems
     return allItems
    else
     return $http.get(...)
  .then ->
    Полезные действия...
, чтоб сохранить promise и синхронность его выполнения?
Проблема в том, что даже, если массив существует, вызов "Полезные действия..." происходит асинхронно, что в свою очередь вызывает моргание содержимого в виджете.
Может кто знает как выполнить promise синхронно?

nerv_ 07.04.2015 14:05

Цитата:

Сообщение от FireVolkhov
Promise как сделать синхронным?

никак

Цитата:

Сообщение от FireVolkhov
вызов "Полезные действия..." происходит асинхронно, что в свою очередь вызывает моргание содержимого в виджете.

ставь спиннер

FireVolkhov 07.04.2015 15:34

Костыль по быстрому накидал
angular.module 'KeepTeam.Common'
	.service 'SynchroQ', ($rootScope) ->
		_evalAsync: null

		isSynchroOn: false
		synchronousOn: ->
			unless @isSynchroOn
				@isSynchroOn = true
				@_evalAsync = $rootScope.$evalAsync

				$rootScope.$evalAsync = (callback) ->
					callback?()

		synchronousOff: ->
			if @isSynchroOn
				@isSynchroOn = false

				if @_evalAsync
					$rootScope.$evalAsync = @_evalAsync
					@_evalAsync = null

и в коде
promise = $q.when()
 if allItems
  SynchroQ.synchronousOn()
  promise.$$state.status = 1
 promise.then ->
    if allItems
     return allItems
    else
     return $http.get(...)
  .then ->
    SynchroQ.synchronousOff()
    Полезные действия...

Это выглядит очень костыльно и по хорошему, чтоб решить задачу придется сделать модифицированный сервис $q

nerv_ 07.04.2015 16:36

О, мои глаза :D Что ты делаешь? Обещания созданы быть асинхронными.


Часовой пояс GMT +3, время: 09:18.