comment faire une requête http synchrone dans angular js

Comment faire pour bloquer la requête http dans AngularJS afin que je puisse utiliser la réponse $http sur la toute prochaine ligne?

Dans l'exemple suivant, $http objet de ne pas renvoyer le résultat à la ligne suivante pour que je puisse passer ce résultat à fullcalender(), une bibliothèque JavaScript, parce que $scope.data renvoie la valeur vide.

voici le code d'exemple:

$http.get('URL').success(function(data){
    $scope.data = data;
});

$.fullCalender({
    data: $scope.data
});
18
demandé sur Ferie 2014-11-05 09:14:02

3 réponses

Vous pouvez utiliser promesses pour que.

voici un exemple:

$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)      
    });

}
2
répondu Giwwel 2015-04-27 07:46:06

Vous ne pouvez pas, vous aurez besoin de la traiter par des promesses, mais vous pouvez essayer de faire comme ceci:

$http.get('URL').success(function(data){
    angular.copy(data, $scope.data);
});

$.fullCalender({
    data: $scope.data
});

mais la plupart des gens feraient juste

$http.get('URL').success(function(data){
    $.fullCalender({
        data: data
    });
});

si quelque soit votre objet fullCalender ne fonctionne pas avec les données async, vous pourriez avoir besoin de l'envelopper dans quelque chose comme ng-if ou de le forcer à se redessiner lorsque les données ont été fournies. Vous pouvez également forcer le controller à ne pas charger jusqu'à ce que les données soient chargées en utilisant la route resolve.

2
répondu John 2014-11-05 07:22:38

Voici un pratique, gracieuseté de l'utilisateur Kirill Slatin qui a posté la réponse en commentaire. Utilisation pratique exemple au bas de la réponse.

Si, comme moi, vous devez utiliser la réponse de l'objet comme une étendue variable, cela devrait fonctionner:

$http.get('URL').success(function(data){

$scope.data = data;
$.fullCalender = $scope.data;
$scope.$apply()
});

$scope.$apply() est ce que persistera l'objet de la réponse de sorte que vous pouvez utiliser ces données.

-

Pourquoi auriez-vous besoin de faire cette?

j'ai essayé de créer une page "Modifier" pour mon application Recettes. J'ai besoin de remplir mon formulaire avec la recette de données. Après avoir fait ma demande GET, et avoir passé les données de réponse au $scope.en forme, je n'ai rien eu... $scope.$apply() et Kirill Slatin a beaucoup aidé. Cheers mate!

Voici l'exemple de mon editrecontroller:

  $http.get('api/recipe/' + currentRecipeId).then(
    function (data) {
      $scope.recipe = data.data;
      $scope.form = $scope.recipe;
      $scope.$apply()
    }
);

j'Espère que ça aide!

1
répondu Bptstmlgt 2017-05-23 12:10:39