У меня есть функция, и несколько $ http получают запросы внутри нее. Мне нужно вызвать другую функцию после того, как она выполнит каждый запрос $ http. Но он всегда выполняет функцию до завершения запроса. какова причина? Есть ли способ решить это?

$scope.json=function(){
        $scope.loading = true;
        $http.get(DataElementUrl).then(function (response) {
            if (!response.data == "")
            dataElementJson = response.data;

        });
        $http.get(categoryComboUrl).then(function (response) {
                if (!response.data == "")
                    categoryComboJson = response.data;                   
        });
        $http.get(categoryUrl).then(function (response) {
                    if (!response.data == "")
                       categoryJson = response.data;                        
        });
        check++;
        $scope.getJson();
};
2
user4363266 17 Дек 2015 в 22:38

3 ответа

Лучший ответ

Вы можете использовать функцию $ q 'all':

    var a = $http.get(DataElementUrl).then(function (response) {
        if (!response.data == "")
        dataElementJson = response.data;

    });
    var b = $http.get(categoryComboUrl).then(function (response) {
            if (!response.data == "")
                categoryComboJson = response.data;                   
    });
    var c = $http.get(categoryUrl).then(function (response) {
                if (!response.data == "")
                   categoryJson = response.data;                        
    });

    $q.all([a, b,c]).then(function(result) {
      check++;
      $scope.getJson();
    });
9
Dan 17 Дек 2015 в 19:45

Это происходит потому, что сетевые вызовы в JavaScript являются асинхронными. Что вы должны сделать, это посмотреть в q сервис, который предлагает Angular. Это библиотека обещаний.

Если вы хотите вызвать метод, когда все 3 завершены, вам нужно будет использовать

.all([promise1, promise2], fulfilled, rejected)

Который будет вызывать выполненный обратный вызов, когда все обещания в массиве будут выполнены.

4
Sam Jacobs 17 Дек 2015 в 19:45

Я бы использовал $ q.all () вот так:

$scope.json=function(){
    $scope.loading = true;

    var promises = [$http.get(DataElementUrl),
                    $http.get(categoryComboUrl),
                    $http.get(categoryUrl)]

    $q.all(promises).then(function(results){
          dataElementJson = results[0].data,
          categoryComboJson = results[1].data,
          categoryJson = results[2].data
    });
};
2
haimlit 17 Дек 2015 в 20:47