Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Как отследить окончание нескольких асинхронных запросов (https://javascript.ru/forum/angular/46026-kak-otsledit-okonchanie-neskolkikh-asinkhronnykh-zaprosov.html)

hopest 25.03.2014 13:14

Как отследить окончание нескольких асинхронных запросов
 
Есть директива типа loading

.directive('loadingContainer', function () {
        return {
            restrict: 'A',
            scope: false,
            link: function (scope, element, attrs) {
                var loadingLayer = angular.element('<div class="loading">div>');
                element.append(loadingLayer);
                element.addClass('loading-container');
                scope.$watch(attrs.loadingContainer, function (value) {
                    loadingLayer.toggleClass('ng-hide', !value);
                });
            }
        };
    })

//html
<div loading-container="vm.loading"></div>

//js

getData: function ($defer, params) {
               $scope.vm.loading = true;
                dataFactory.getTasksLevel0(params.page(), params.count(), $scope.vm.isLoadArchiv, $scope.vm.fltr_TaskType).success(function (data) {
                    
                    dataFactory.tasksMakeAdditonalFields(data.Data.TasksLevel0, $sce);
                    params.total(data.Data.CountTasks);
                    $scope.vm.loading = false;

…..


Блокируется экран во время загрузки данных

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

FireVolkhov 25.03.2014 15:01

Для множества запросов есть $q.all вот урок как пользоваться

в директиве что-то такое
scope.$watch(attrs.loading, function(newVal, oldVal, scope){
  if(newVal){
    if(newVal.$promise && !newVal.$resolved){
      promise = newVal.$promise;
    } else {
      promise = newVal;
    }

    if(_.isFunction(promise.finally)){
      startLoading();
      promise.finally(endLoading);
    }
  }
});

и остается только собрать обещания всех контроллеров в одно обещание

nerv_ 25.03.2014 15:29

Цитата:

.directive('loadingContainer', function () {

На первый взгляд порнография :) Используй шаблоны (template || templateUrl).

Цитата:

Сообщение от FireVolkhov
Для множества запросов есть $q.all

Я бы сказал, что для "управления" асинхронностью используют обещания.


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