2015-07-13 145 views
0

在我的角度應用$更新功能遞延我更新任務如下

task.$update().then(function (task) { 
    // success 
}, function (response) { 
    // failure 
}); 

從後端我得到一個422回來,但第一個回調被調用。

我的資源看起來像這樣

angular.module('App') 
    .factory('Task', function ($resource) { 
     var resource = $resource('/admin/tasks/:id', { id: '@id' }, { 
      new: { 
       method: 'GET', 
       url: '/admin/tasks/new' 
      }, 
      update: { 
       method: 'PUT' 
      }, 
      ... 
     }); 

    return resource; 
}); 

的問題是,在什麼情況下被稱爲第二個回調?而且如果需要的話,我能在update方法做,使得第二回調叫什麼名字?

UPDATE:之所以成功回調被調用所有的時間是因爲一個錯誤攔截我

angular 
.module('App') 
    .factory('errorInterceptor', function ($location, $q, $rootScope) { 
     return { 
      responseError: function (response) { 
       if (response.config.url.match($location.$$host)) { 
        $rootScope.error = response; 

        return $q.reject(response); 
       } 

       return $q.when(response); 
      } 
     }; 
    }); 

很顯然,如果你做return $q.when(response);你告訴角度說,一切都很好,對不對?

回答

1

的回調被指定爲PARAMS到$更新()函數,就像這樣:

$task.$update(function(task) {}, function(response) {}) 

$resource官方文檔:

類對象或實例對象上的操作方法可以用以下參數調用 :

  • HTTP GET「class」操作:Resource.action([parameters],[success],[error])
  • 非GET「類」操作:Resource.action([parameters],postData,[success],[error])
  • 非GET實例動作:例如$行動([參數],[成功],[錯誤])

的事情是,不像$ HTTP,$更新或任何資源方法不返回直接承諾。他們返回一個空的參考。

注意$資源使用$http內部,因此$ HTTP文檔應用(關於回調):

200和299之間的響應狀態代碼被認爲是成功的狀態,並會導致成功的回調之中調用。請注意,如果響應是重定向,XMLHttpRequest將會透明地遵循它,這意味着錯誤回調將不會被調用。

+0

我已經試過你的suggesion [這裏](http://jsfiddle.net/3PUxx/78/)和它的作品。但在我的應用程序中,第一個回調仍然被調用。在我的應用程序的一個HTTP狀態代碼'422',它可以是它與此有關。凡德的文檔中描述了它是如何決定哪個回調被調用?也許可以定義你自己的'$ update'功能? –

+0

我也發現了[這](http://stackoverflow.com/questions/18907117/angular-resource-not-invoking-my-error-callback-function)後,它使用攔截器來拒絕迴應?! 「4XX」響應真的需要嗎? –

+0

$ resource使用$ http,因此$ http的文檔適用: > 200到299之間的響應狀態代碼被視爲成功狀態,並且會導致調用成功回調。因此,任何> = 400(不重定向)都會觸發錯誤回調。 如果您想要定義一個針對所有請求調用的回調函數,則只需要一個攔截器。攔截器將在$ resource方法中的回調定義之前運行。 –