2017-07-20 44 views
0

分開我有這樣的代碼:如何succesCallback從errorCallback在角控制器

app.factory('clients', ['$http', function ($http) { 
    var _getClient = function (clientId, callback) { 
     callback = callback || function() {}; 
     $http({ 
      method: 'GET', 
      url: '/simple_crm/web/api.php/client/'+clientId 
     }).then(function (data) { 
      callback(data); 
     }, function (error) { 
      callback(error); 
     }); 
    }; 
    return { 
     getClient: _getClient 
    }; 
}]); 

,並在控制器

app.controller('ClientDetailCtrl', ['$scope', 'clients', '$routeParams', function ($scope, clients, $routeParams) { 
    $scope.user = {}; 

    clients.getClient($routeParams.clientId, 
      function (data) { 
       //The block executes clientId is correct 
       $scope.user = data; 
       if (404 === data.status) { 
        //The block executes when Id does not exist and status page is 404 
       } 
      } 
    ); 
}]); 

此代碼工作正常 - 隱藏/顯示在頁面上的div塊,但有可能隔離代碼塊錯誤,例如:

clients.getClient($routeParams.clientId, 
    function (data) { 
     //clientId is correct 
     $scope.user = data; 
    }, 
    function (data) { 
     if (404 === data.status) { 
      //clientId does not exist 
     } 
    } 
); 

有沒有什麼可能什麼是最佳實踐?

+0

你可以使用攔截器,更普遍的HTTP錯誤代碼。 https://docs.angularjs.org/api/ng/service/$http –

回答

0

此代碼工作正常 - 隱藏/顯示在頁面上的div塊,但 有可能的代碼錯誤例如塊隔離:

您可以定義另一個回調的錯誤和把它當錯誤

var _getClient = function (clientId, successCallback, errorCallback) { 
    if (success) { 
    successCallback(); 
    } 
    if (error) { 
    errorCallback() 
    } 
} 

有什麼事情是可能的,什麼是最好的做法

最好也是最簡單的方法是在你的工廠中返回這個$ http promise,這樣你就可以在你的控制器中使用所有的$ http promise方法。 then().success()或。 error())。您只會使用一個承諾,並且如果需要可以與另一個承諾鏈接,而不會被回調中斷。

廠:

var _getClient = function (clientId) { 
    return $http({ 
     method: 'GET', 
     url: '/simple_crm/web/api.php/client/'+clientId 
    }); 
}; 

控制器:

clients.getClient($routeParams.clientId).then(
    function(data) { 
    //success 
    }, 
    function(error) { 
    //error 
    } 
); 
+0

謝謝,它工作得很好,看起來很清楚 –