Как сделать синхронный 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 или принудительно перерисовать, когда данные будут предоставлены. Вы также можете заставить контроллер не загружаться, пока данные не будут загружены с использованием разрешения маршрута.

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