Служба angularjs не ожидает завершения функции succes

#javascript #angularjs

#javascript #angularjs

Вопрос:

У меня есть служба, которая не ожидает вызова функции success в контроллере. Компилятор анализирует строки после моего вызова из службы, а это не то, чего я хочу. Когда я перехожу в режим отладки, мои данные появляются там только через 10 мс или что-то в этом роде

 .factory('myService', ['$http', '$q', function($http, $q){
var deferObject,
    myMethods = {

        getDepartments: function(d) {
            console.log("Am ajuns");
            var allDepartments=[];
            var promise=$http.get("http://localhost:8087"   "/projects/" d );
            var deferObject = deferObject || $q.defer();
            console.log("Am ajuns2");
            promise.then(

                // OnSuccess function
                function(answer){
                    console.log("Am ajuns3");
                    // This code will only run if we have a successful promise.
                    deferObject.resolve(answer);
                            var setDepartments = new Set();

                            for (var i = 0; i < answer.data.length; i  ) {
                                setDepartments.add(answer.data[i].department);

                            }

                            setDepartments.forEach(function (value) {
                                var department = {name: value};
                                allDepartments.push(department);

                            });
                    console.log(allDepartments);
                    return allDepartments;
                },
                // OnFailure function
                function(reason){
                    // This code will only run if we have a failed promise.
                    deferObject.reject(reason);
                });

            return allDepartments;
        },
        getData: function(d) {
            var promise=$http.get("http://localhost:8087"   "/projects/" d )
             var deferObject = deferObject || $q.defer();

            promise.then(
                // OnSuccess function
                function(answer){

                    // This code will only run if we have a successful promise.
                    deferObject.resolve(answer);
                },
                // OnFailure function
                function(reason){
                    // This code will only run if we have a failed promise.
                    deferObject.reject(reason);
                });

            return deferObject.promise;
        }

    };

return myMethods;

}]);
  

Комментарии:

1. как ваши getData, getDepartments должны возвращать обещание.

2. Почему вы разделяете одно и то же deferObject в нескольких обещаниях? Я могу избежать проблемы, если вы вызываете оба своих заводских метода одновременно, пока оба запроса все еще обрабатываются. Просто верните $http вызов. Вы не можете вернуться из .then такого обещания, вызывающий код изменился с момента его инициализации. К тому времени, когда обещание будет выполнено, делать нечего return . Вот почему вы везде используете promises, а не смешиваете и сопоставляете. Затем, когда вы возвращаетесь из одного обещания, оно передается следующему в цепочке.

3. Я понимаю @ste2425, должен ли я возвращать только ответ http get?

4. К сожалению, я не могу написать полный ответ, поэтому придется сделать комментарий, очень кратко вы возвращаетесь из своего сервиса / фабрики $http.get("http://localhost:8087" "/projects/" d ) , а затем в вызывающем коде, который вы можете сделать myService.getData().then(d => console.log(d)); . По сути $http , возвращает обещание, поэтому верните его из вашей службы для подключения к вашему контроллеру и т. Д., Чтобы вы могли получать уведомления после завершения сетевого вызова. Вы также можете вложить цепочки обещаний и т. Д. Для сложных асинхронных рабочих процессов.

5. Хорошо @ ste2425, большое вам спасибо!

Ответ №1:

Я решил проблему с помощью q.all , который ожидает завершения каждого запроса, и только после этого программа движется дальше.