1

Я знаю, что я выгляжу глупо, когда спрашиваю об этом, но я не могу это понять.Угловой JS: Почтовый вызов идет в Успехе, а также метод ошибки

Я написал службу, которая обрабатывает почтовый вызов на сервер. $q сервис возвращает обещание обратно функции контроллера, которая вызвала эту услугу.

Услуги:

app.service('AjaxService', ['$http','$q','$log', function($http,$q,$log) { 
    return { 
     getSearchresultPost : function(url,data){ 
      var defer = $q.defer(); 
      $http.post(url, data) 
      .then(function(data, status, header, config){ 
       defer.resolve(data); 

      }).then(function(data, status, header, config){ 
       defer.reject(data); 
      }); 
      return defer.promise; 
     } 
    }; 
}]); 

Контроллер

app.controller("kitGuideNavigationController",['$scope','$window','$timeout','AjaxService',function($scope,$window,$timeout,AjaxService){ 
AjaxService.getSearchresultPost("/services/knowledge/getProducts",pathToCall) 
     .then(function(data){ 
      console.log("Data ",data); 
     }).then(function(data){ 
      console.log("Some Error Occured"); 
     }); 
}]); 

Когда я пытаюсь запустить код, я получаю обе консоли получать распечатаны.

Я не понимаю, что становится неправильным. Может кто-то помочь?

+0

Вы можете использовать различались возвращаемый '$ http.post()', нет необходимости создавать пользовательские различались, если у вас нет фантазии вещи, как вложенные вызовы –

ответ

1

изменить второе «затем» на «catch», должно исправить это. Вы должны сделать это в обоих случаях.

app.controller("kitGuideNavigationController",['$scope','$window','$timeout','AjaxService',function($scope,$window,$timeout,AjaxService){ 
AjaxService.getSearchresultPost("/services/knowledge/getProducts",pathToCall) 
     .then(function(data){ 
      console.log("Data ",data); 
     }).catch(function(data){ 
      console.log("Some Error Occured"); 
     }); 
}]); 

обновление

также, как я видел, вы используете $ HTTP, проверить here

+0

Спасибо большое @Fribu :) – vaibhav

+0

@vaibhav Зачем вызывать '.then()' дважды, так или иначе? Если бы это был я, я бы просто использовал один параметр «.then()» и использовал if, чтобы решить, разрешать или отклонять первоначальное обещание. – cst1992

+0

На самом деле, я должен написать код от Catch, поэтому я использую второй, а затем для обработки ошибок. – vaibhav

1

Вы можете изменить службу и передать второй параметр (функция ошибки) в $ http.post как это (документация: https://docs.angularjs.org/api/ng/service/$http):

app.service('AjaxService', ['$http','$q','$log', function($http,$q,$log) { 
    return { 
     getSearchresultPost : function(url,data){ 
      var defer = $q.defer(); 
      $http.post(url, data) 
      .then(function(data, status, header, config){ 
       defer.resolve(data); 

      }, function(error, status, header, config){ 
       defer.reject(error); 
      }); 
      return defer.promise; 
     } 
    }; 
}]); 

И в контроллере можно передать второй параметр также:

app.controller("kitGuideNavigationController",['$scope','$window','$timeout','AjaxService',function($scope,$window,$timeout,AjaxService){ 
AjaxService.getSearchresultPost("/services/knowledge/getProducts",pathToCall) 
     .then(function(data){ 
      console.log("Data ",data); 
     }, function(error){ 
      console.log("Some Error Occured", error); 
     }); 
}]); 
0

Там нет необходимости производить обещание с $q.defer как сервис $ HTTP уже возвращает обещание:

app.service('AjaxService', ['$http','$q','$log', function($http,$q,$log) { 
    return { 
     getSearchresultPost : function(url,data){ 
      //var defer = $q.defer(); 
      var promise = $http.post(url, data) 
      //.then(function(data, status, header, config){ 
      .then(function (response) { 
       var data = response.data; 
       //defer.resolve(data); 
       //return data to resolve 
       return data;  
      //}).then(function(data, status, header, config){ 
      }).catch(function(response) { 
       var data = response.data; 
       //defer.reject(data); 
       //throw data to reject with value 
       throw data; 
      }); 
      //return defer.promise; 
      return promise; 
     } 
    }; 
}]); 

также отметить, что .then и .catch методы вызова своих функций с response объекта, а не data, но возвращает (или бросает) свойство data обработчику, создает новое обещание, которое разрешает (или отклоняет) это значение.

AjaxService.getSearchresultPost(url,pathToCall) 
    .then(function(data){ 
     console.log("Data ",data); 
    //}).then(function(data){ 
    }).catch(function(data) { 
     console.log("Some Error Occured"); 
    }); 

Для получения дополнительной информации см AngularJS $q Service API Reference - Chaining Promises