Вызов функции после получения ответа от WS - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно вызвать три службы WS перед вызовом локальной функции в зависимости от того, определены некоторые переменные или нет, но функция вызывается до того, как службы получат какой-либо ответ, потому что это может занять некоторое время.Я даже пытался использовать $ timeout, но он не работает

    $scope.$on('search', function (event, data) {
                self.searchDto= data;
                if (self.searchDto.userCode) {
                    self.searchByUserCode(self.searchDto.userCode).then(function (data) {
                        self.userCode= data.find(function (item) {
                            return item.mstId === self.searchDto.userCode;
                        });
                    });
                }

                if (self.searchDto.companyCode) {
                    self.serachByCompanyCode(self.searchDto.companyCode).then(function (data) {
                        self.companyCode= data.find(function (item) {
                            return item.mstId === self.searchDto.companyCode;
                        });
                    });
                } 

                if (self.searchDto.jobCode) {
                    self.searchByJobCode(self.searchDto.jobCode).then(function (data) {
                        self.jobCode= data.find(function (item) {
                            return item.mstId === self.searchDto.jobCode;
                        });
                    });
                } 

//I tried with this timeout but it didnt work
                $timeout(function () {
                     self.searchPeople();
                }, 1000);
            });

Кто-нибудь знает, как можно вызвать метод searchPeople после ответов WS?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Использование обещаний и $q.all()

var promises = [];
promises.push(self.searchByUserCode(self.searchDto.userCode).then(function (data) {
                        self.userCode= data.find(function (item) {
                            return item.mstId === self.searchDto.userCode;
                        });
                    }));

.then() возвращает обещание.Сделайте это для 3 сервисных звонков, а затем дождитесь их завершения

$q.all(promises).then(function(){
    self.searchPeople();
})

Я вижу, что вы можете не звонить на все ваши услуги.$q.all() будет ждать обещания, которое вы положите в массив.Имейте в виду, что он также выполнит ваш вызов, если ни одна из ваших служб не была выполнена, если вам нужен хотя бы один из них, вы можете добавить проверку для promises.length > 0 до $q.all().

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

0 голосов
/ 01 июня 2018

Установка тайм-аута не является правильным подходом здесь.Одним из решений может быть: вы должны поместить 3 WS во вложенные и вызов функции внутри последнего обратного вызова WS.Это также зависит от того, сколько аргументов нужно вашему searchPeople.Если он работает только с полностью 3 аргументами из вызовов WS, другое решение - поместить вызов функции во все 3 обратных вызова WS, а внутри функции searchPeople, вы должны добавить оператор условия, чтобы проверить, полностью ли у нас 3 аргумента, прежде чем выполнять поиск

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...