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.