Angularjs:如何编写$ http作为控制器的承诺

时间:2015-10-23 15:15:50

标签: javascript angularjs http promise

目前我在控制器中使用$ http.success()。error()。但是,angular已经弃用了成功/错误支持,并且根据样式指南,写入服务器$ 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.
                    });
            }
        };
    });

2 个答案:

答案 0 :(得分:1)

关注'官方'文档,你是正确的,所以继续。

我会做像你这样的事情。这里是官方文档的链接:https://docs.angularjs.org/api/ng/service/$http

答案 1 :(得分:1)

我不会盲目地这样做

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

以上假设所有有效的HTTP响应都会变异为数据,但这与您执行此操作时的情况不同。

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

$ http中的成功回调仅在响应状态为200系列代码时触发,当您切换到then所有成功的HTTP响应(200,300,400等)时。)作为已解决的回复处理。

因此,你想要做这样的事情。

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

这将解决仅对响应中的数据成功的200个响应。现在,您的服务返回的承诺将仅解析为该数据或被拒绝。

对于错误处理,我建议您使用拦截器而不在指令中实现错误处理(除非有特殊情况)。