2017-04-12 56 views
1

我在我的角度应用程序中嵌套了http调用。

$scope.saveAsPaused = function() { 

       var cmsResponse = saveAtCMS(); 
       cmsResponse.then(function(data){ 

         saveAtRe(data).then(function(data){ 

           successSave(data); 
         }, function(data, isOffDel){ 

           delOnFailRE(data); 
         }); 
       }); 
     } 

var saveAtRe = function(data) { 
      return $http.post('/pause', data); 
     } 

后端代码在JAVA

@POST 
    @Produces("application/json") 
    @Path("/pause") 
    public Response createInPauseState(CampaignConfigurationBeans camp) { 

     return Response.status(502).entity("false").build(); 

    } 

saveAtRe功能,我返回从后端的502状态码,但仍然,我的应用程序在调用successSave功能。

任何人都可以解释我做错了什么吗?

+0

,这将有助于了解。 –

+0

你可以尝试使用Response.Status.BAD_GATEWAY而不是502。我不是很确定它会工作,但在文档http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/ Response.Status.html#BAD_GATEWAY,它说502错误的网关,而不仅仅是502. –

回答

1

您可能需要考虑使用then()方法而不是传统的success \ failure方法。对承诺读或检查出这篇文章,解释差异 - 角HttpPromise:success/error方法和then的论点

在岗位之间的差异上面看看在最后的答案之一,其在例如使用给人则()方法,也是一个捕捉()

试一试,看看它给你更多一致的结果,或者什么是结束了在catch()

+0

OP确实使用'.then'而不是'.success' – tanmay

0

Angular Docs

200和299之间的响应状态代码被认为是成功的 状态,并会导致成功的回调被称为预计将引发错误回调

502状态码,你的代码看起来确定。您能否在成功回调中检查返回的状态,例如

saveAtRe(data).then(function(data){ 
          console.log(data.status); 
        }, function(data, isOffDel){ 
          delOnFailRE(data); 
        }); 

如果接收到的状态是502,那么它是不是普遍行为,如果在你的代码应用其他角度的HTTP拦截我会检查。

+0

是的,状态即将到达502.我已经证实。 – user3587856

+0

[Angular的代码](https://github.com/angular/angular.js/blob/master/src/ng/http.js)在这里非常简单。 'function isSuccess(status){ return 200 <= status && status <300; '必须有一些应用程序的自定义逻辑被应用。 – udalmik

0

这可能是美国可以过交流你的后端代码对你有所帮助

$scope.saveAsPaused = function() { 
       var cmsResponse = saveAtCMS(); 
       cmsResponse.then(function(data){ 
         saveAtRe(data).then(function(data){ 
           successSave(data); 
         }, function(data, isOffDel){ 

           delOnFailRE(data); 
         }); 
       }); 
      } 
     var saveAtRe = function(data) { 
      var q=$q.defer(); 
      $http.post('/pause', data).then(function(data) 
      { 
       q.resolve(data); 
      },function(error){ 
       q.reject(error); 
      }) 
      return q.promise;; 
     } 
+0

这是一个反模式,'$ http.post(...)'本身返回诺言 – tanmay

+0

包装承诺到另一个,有什么区别? – udalmik

+0

@gitaram,以前是我只使用这种模式,它工作得很好。但我不明白为什么它不按我提到的方式工作。 – user3587856