Как реализовать фоновый процесс для контроллера в angularjs? - PullRequest
0 голосов
/ 02 июля 2018

Предположим, есть ссылка размера несколько. Каждый щелчок по ссылке обрабатывается контроллером. Рассмотрим ситуацию:

  1. Пользователь заходит на какую-то страницу. Допустим, это /search, где пользователь вводит ключевые слова и нажимает кнопку поиска.
  2. Запущен фоновый процесс (в нашем случае waitint для поискового ответа)
  3. пользователь переходит на другую ссылку
  4. через некоторое время пользователь возвращается на первую страницу (/search)

В момент 4 angulajs загружает страницу, когда пользователь заходит на нее в первый раз. Как заставить ангулей помнить не состояние, а процесс? Например. если процесс не завершен, он показывает индикатор выполнения, но если он завершился, он дает данные из результата процесса и отображает новую страницу. Как это реализовать?

Примечания

  • Я нашел это , но это просто состояние без сохранения процесса.
  • Я обнаружил , что , но речь идет о запуске некоторого процесса в фоновом режиме без управления результатами или состоянием процесса (запущен или завершен)

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Исходя из вопроса (немного больше контекста или кода помогло бы более целенаправленно отвечать на вопросы), при рассмотрении асинхронных операций в angularJS всегда целесообразно использовать геттеры и сеттеры внутри службы, чтобы избежать множественных вызовов REST.

Обращаем ваше внимание - Услуги одиночные, контролера нет.

например:

angular.module('app', [])
   .controller('ctrlname', ['$scope', 'myService',  function($scope, myService){

    myService.updateVisitCount();
    $scope.valueFromRestCall = myService.myGetterFunctionAssociated(param1, param2);

    //Use $scope.valueFromRestCall to your convinience.

   }]

   .service('myService', ['$http', function($http){

        var self = this;
        self.numberOfVisits = 0;
        self.cachedResponse = null;

        self.updateVisitCount = function(){
            self.numberOfVisits+=1;
        }

        self.myGetterFunctionAssociated = function(param1, param2){
            if self.cachedResponse === null || self.numberOfVisits === 0 {
                return $http.get(url).then(function(response){
                    self.cachedResponse = response;
                    return response;
                });
            }
            else {
                      return self.cachedResponse;
                 }
        }

        return {
            updateVisitCount: function(){
                 self.udpateVisitCount();
            },
            myGetterFunctionAssociated : function(param1, param2){
                 return self.myGetterFunctionAssociated(param1, param2);
            }
        }

   }]
0 голосов
/ 02 июля 2018

Вы можете использовать сервис angularjs, чтобы запомнить этот «Процесс» создания вызова API и получения данных из него. Вот простая реализация.

вся идея здесь в том, чтобы создать угловой сервис, который будет делать вызов API, сохранить данные так же, как и состояние данных, чтобы к ним можно было получить доступ из других модулей angularjs. обратите внимание, что поскольку сервисы angularjs являются одноэлементными, это означает, что все их состояние будет сохранено.

app.service('searchService', function() {
    this.searchState={
     loading: false,
     data: null,
     error: null
    }
    this.fetchSearchResults = function(key){
    // call api methods to get response
    // can be via callbacks or promise. 

     this.searchState.loading=true;

     someMethodThatCallsApi(key)
      .then(function(success){
        this.searchState.loading=false;
        this.searchState.data=success;
        this.searchState.error=null
       })
      .catch(function(error){
       this.searchState.loading=false;
       this.searchState.data=null;
       this.searchState.error=error
      });

    }
    this.getState = function(){
      return this.searchState
    }
});

// в вашем контроллере

app.controller('searchController',function(searchService){
   // in your initialization function call the service method.
   var searchState = searchService.getState();
   // search state has your loading variables. you can easily check 
   // and procede with the logic.
   searchState.loading // will have loading state
   searchState.data // will have data
   searchState.error // will have error if occured.
});

Даже если вы переходите со страниц. угловой сервис сохранит состояние, и вы можете получить те же данные из любой точки приложения. вам просто нужно внедрить сервис и вызвать метод получения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...