2015-10-23 69 views
0

目前我在我的控制器中使用$ http.success()。error()。然而,角度已棄用成功/錯誤支持,並根據風格指南編寫服務器$ http調用的最佳位置是服務。

鑑於此,我想知道如果下面的代碼是正確的方式前進。

控制器:

var funcWithPromise = function() { 
      // This service's function returns a promise, but we'll deal with that shortly 
      TestService.getWeather() 
       .then(function(data) { 
        if (data.forecast==='good') { 
         prepareFishingTrip(); 
        } else { 
         prepareSundayRoastDinner(); 
        } 
       }, function(response) { 
        // promise rejected, could log the error with: 
         $scope.errorDiv = response.data; 
         console.log('error', response); 
         //Manipulate DOM 
        }); 
      }; 

服務:

app.factory('TestService', function ($http, $q) { 
     return { 
      getWeather: function() { 
       // the $http API is based on the deferred/promise APIs exposed by the $q service 
       // so it returns a promise for us by default 
       return $http.get('http://weather') 
        .then(function(response) { 
         return response.data; 
        }, function(response) { 
         // something went wrong 
         return $q.reject(response); //Not sure is it must be response or reponse.data here. With reponse I can utilize response.status. 
        }); 
      } 
     }; 
    }); 

回答

1

我不會盲目地做

$http(..).then(function(response) { 
     return response.data; 
}); 

上述假設所有有效的HTTP響應變異成數據,但這是不一樣的,當你這樣做的這個。

$http(..).success(function(data) { 
     return data; 
}); 

在$ HTTP的成功回調,當你切換到then只有當響應狀態是200系列碼發射,所有成功的HTTP響應(200,300,400等)的處理已解決的迴應。

因此,你想要做這樣的事情。

return $q(function(resolve,reject){ 
    $http(..).then(function(response) { 
     if(response.status == 200) { 
      resolve(response.data); 
     } else { 
      reject(response); 
     } 
    }); 
}); 

這將解決成功的200響應只響應中的數據。現在由您的服務返回的承諾只會解析爲該數據或被拒絕。

對於錯誤處理,我建議你使用一個攔截器,而不是在指令中實現錯誤處理(除非有特殊情況)。