Http-сервис задерживает обработку до тех пор, пока не будут возвращены данные

Я работаю над своим проектом angularjs. Я создал этот сервис:

(function () {
    "use strict";

    angular.module("manageItems").factory("manageItemsService", ["$http", "config", manageItemsService]);

    function manageItemsService($http, config) {
        var service = {
            getNewItems: getNewItems,
        };
        return service;

        function getNewItems(session, mapName) {
            return $http.get(serviceUrl + 'getNewItems/' + session + "/" + mapName);
        }

    }
})();

А вот как я вызываю сервис с контроллера:

function getNewItems() {
    manageItemsService.getNewItems(mapguideService.mapName, mapguideService.sessionId).then(function (result) {
        self.currentItems = result.data;
    })
}

Мне нужно сделать сервис, чтобы отложить, пока ответ не вернулся.

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

3 ответа

Во-первых, мне нужно сказать, что http-запросы на самом деле выполняются асинхронно, чтобы не останавливать приложение во время возврата результата.

Таким образом, у вас есть два варианта: используйте угловой шаблон для настройки вашего метода, чтобы обработать результат, поэтому вы должны передать функцию обратного вызова в службу, чтобы служба, а не контроллер установила связь. Это было бы что-то вроде:

Обслуживание:

 (function () {
        "use strict";

        angular.module("manageItems").factory("manageItemsService", ["$http", "config", manageItemsService]);

        function manageItemsService($http, config) {
            var service = {
                getNewItems: getNewItems,
            };
            return service;

            function getNewItems(session, mapName, callback, errorCallback) {
                $http.get(serviceUrl + 'getNewItems/' + session + "/" + mapName).then(callback, errorCallback);;
            }

        }
    })();

контроллер:

function getNewItems() {
    manageItemsService.getNewItems(mapguideService.mapName, mapguideService.sessionId, function (result) {
        //this callback will be called asynchronously when the response is available
        self.currentItems = result.data;
    }, function(error) {
        // called asynchronously if an error occurs
        // or server returns response with an error status.
    })
}

Второй вариант - совершенно не рекомендуется вставлять цикл, пока ожидается результат... (плохо)

Я надеюсь, что помог!

Тогда вы могли бы быть мириться .then на getNewItems $http call. И на основе полученных данных ответа решите, возвращать ли данные или вызывать другой метод обслуживания.

function anotherFunction(){
    return $http.get(url);
}

function getNewItems(session, mapName) {
    return $http.get(serviceUrl + 'getNewItems/' + session + "/" + mapName).then(function successCallback(response){
       var data = response.data;
       //call another function if data is empty
       if(!data.length)  
         return anotherFunction(); //make sure another function should return promise
       return data;
    });
}

Код должен делать цепочки обещаний.

Чтобы сделать getNewItems Функция цепочки, возвращает производное обещание:

function getNewItems() {
    //vvvv RETURN promise
    return manageItemsService.getNewItems(mapguideService.mapName, mapguideService.sessionId)
      .then(function (response) {
        self.currentItems = response.data;
        //RETURN value to chain
        return response.data;
    });
};

Затем используйте возвращенное обещание, чтобы связать больше операций:

getNewItems().then( function(currentItems) {
   //Evaluate current Items
   if ( ok ) {
       return "DONE";
   } else {
       //RETURN to chain something else
       return getOtherItems();
   };
}).then( function(otherItems) {
   if (otherItems == "DONE") return;
   //ELSE
   self.otherItems = otherItems;
   //Do further chaining
});

Потому что зовет .then Метод обещания возвращает новое производное обещание, легко можно создать цепочку обещаний.

Можно создать цепочки любой длины, и, поскольку обещание может быть разрешено с помощью другого обещания (что приведет к дальнейшему отложению его разрешения), можно приостановить / отложить разрешение обещаний в любой точке цепочки. Это позволяет реализовать мощные API.

- Справочник по API AngularJS $q - Обещания цепочки

Другие вопросы по тегам