Как сделать синхронный HTTP-запрос в угловых JS
Как сделать блокировку http-запроса в AngularJS, чтобы я мог использовать ответ $ http на следующей строке?
В следующем примере $http
объект не возвращает результат на следующую строку, так что я могу передать этот результат fullcalender()
библиотека JavaScript, потому что $scope.data
возвращает пустое значение
Это пример кода:
$http.get('URL').success(function(data){
$scope.data = data;
});
$.fullCalender({
data: $scope.data
});
3 ответа
Вы можете использовать обещания для этого.
вот пример:
$scope.myXhr = function(){
var deferred = $q.defer();
$http({
url: 'ajax.php',
method: 'POST',
data:postData,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
//if request is successful
.success(function(data,status,headers,config){
//resolve the promise
deferred.resolve('request successful');
})
//if request is not successful
.error(function(data,status,headers,config){
//reject the promise
deferred.reject('ERROR');
});
//return the promise
return deferred.promise;
}
$scope.callXhrAsynchronous = function(){
var myPromise = $scope.myXhr();
// wait until the promise return resolve or eject
//"then" has 2 functions (resolveFunction, rejectFunction)
myPromise.then(function(resolve){
alert(resolve);
}, function(reject){
alert(reject)
});
}
Вот практический ответ, любезно предоставленный пользователем Kirill Slatin, который разместил ответ в качестве комментария. Пример практического использования внизу ответа.
Если, как и я, вам нужно использовать этот объект ответа в качестве переменной области, это должно работать:
$http.get('URL').success(function(data){
$scope.data = data;
$.fullCalender = $scope.data;
$scope.$apply()
});
$scope.$apply()
это то, что сохранит объект ответа, чтобы вы могли использовать эти данные.
-
Зачем вам это нужно?
Я пытался создать страницу редактирования для моего приложения рецептов. Мне нужно было заполнить мою форму данными выбранного рецепта. После выполнения запроса GET и передачи данных ответа в $scope.form я ничего не получил... $scope.$apply()
и Kirill Slatin помог. Ура, приятель!
Вот пример из моего editRecipeController:
$http.get('api/recipe/' + currentRecipeId).then(
function (data) {
$scope.recipe = data.data;
$scope.form = $scope.recipe;
$scope.$apply()
}
);
Надеюсь, это поможет!
Вы не можете, вам нужно справиться с этим с помощью обещаний, но вы можете попробовать сделать это так:
$http.get('URL').success(function(data){
angular.copy(data, $scope.data);
});
$.fullCalender({
data: $scope.data
});
но большинство людей просто
$http.get('URL').success(function(data){
$.fullCalender({
data: data
});
});
Если какой-либо объект fullCalender не работает с асинхронными данными, вам может потребоваться заключить его в нечто вроде ng-if или принудительно перерисовать, когда данные будут предоставлены. Вы также можете заставить контроллер не загружаться, пока данные не будут загружены с использованием разрешения маршрута.