Ждите ответа http в AngularJS - PullRequest
       2

Ждите ответа http в AngularJS

0 голосов
/ 28 сентября 2018

Я использую angularJS, и я пытаюсь получить результат от серверной части, используя такой сервис:

app.factory('myService', ['$http', '$window', '$rootScope', function ($http, $window, $rootScope) {

return {
    GetTypeName(typeID, callback) {
        $http.get(backend_url + 'type/getById/' + typeID)
            .success(function (response, status, headers, config) {

                if (status === 200) {
                    callback(true, response);
                } else {
                    callback(false);
                }
            })
            .error(function (data, status, headers, config) {
                callback(false);
            });
    }
}   }]);

И я вызываю эту службу с этого контроллера:

getFormationsType = function(){
 for (i = 0; i!= array.length;i++){
     myService.GetTypeName(typeID, function (result, data) {
         if(result){
             console.log(data.name);
             // do something with data.name here, and also need it outside of this func
         } else{
             console.log("error");
         }
     });
 }}

Проблема в том, что когда функция выполняет службу, она не ждет результата и выпрыгивает из функции getFormationsType (), а затем выполняет другие действия перед тем, как вернуть результат.и мне нужен этот результат прямо сейчас.Поэтому мне нужна помощь, чтобы понять, как заставить службу ждать результата, прежде чем выскочить.

Спасибо.

1 Ответ

0 голосов
/ 28 сентября 2018

angularjs работает только с обещанием, реализованным $q, поэтому вы не можете использовать обещание es6 и async / await.Вы можете достичь своей цели с помощью $q следующим образом:

сначала измените свою службу, чтобы вернуть экземпляр обещания:

app.factory('myService', ['$http', '$window', '$rootScope', '$q', function ($http, $window, $rootScope, $q) {

    return {
        getTypeName(typeID) {
            var deferred = $q.defer();
            $http.get(backend_url + 'type/getById/' + typeID)
                .success(function (response, status, headers, config) {

                    if (status === 200) {
                        deferred.resolve({ success: true, data: response });
                    } else {
                        deferred.resolve({ success: false });
                    }
                })
                .error(function (data, status, headers, config) {
                    deferred.resolve({ success: false });
                });
            return deferred.promise;
        }
    }
}]);

, а затем, в своем контроллере, рекурсивно вызывайте свою службу следующим образом:

angular.controller('myController', ['myService', function (myService) {
    var array = [/* init your type id array here. */];
    var index = 0;
    function getFormationsType () {
        myService.getTypeName(this.array[this.index])
            .then(result => {
                console.log(result);
                if (this.index < this.array.length) {
                    this.index += 1;
                    getFormationsType();
                }
            })
            .catch(error => {
                console.error(error);
            });
    }
}]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...