2017-04-12 57 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