Factory不执行$ http.get

时间:2014-10-27 07:12:34

标签: angularjs

我的工厂似乎没有执行我的$http.get。这是我的控制器:

app.factory("myService", function($http) {

    var myService = {
        retrieve: function(id, type) {

        var retrievedData = {
            device: {},
            childDevices: [],
            error: {}
        };
        .
        .
        .
        $http.get(url, headers)
        .success(function(data, status) {
            // some data post-processing
            // some logs
        })
        .error(function(data, status) {
            // some data post-processing
            // some logs
        });

        return retrievedData;

    };

    return myService;

});

$http.get中的日志不会打印。

我在某处需要使用promise,但我看到的大多数示例都直接返回$http.get。我不想立即返回$http.get,因为我需要对工厂中的数据进行一些修改,而不是在控制器中。

感谢。

2 个答案:

答案 0 :(得分:-1)

因为当您返回retrievedData时尚未检索到它。这就是你应该使用承诺的原因:

   app.factory("myService", function ($http,$q) {
     var myService = {
     retrieve: function (id, type) {
        var deferred = $q.defer();
        var retrievedData = {
            device: {},
            childDevices: [],
            error: {}
        };

        $http.get(url, headers).then(function (data) {
                // success do your success things here and return data 
                deferred.resolve(data);
            },
            function (err) {
                deferred.reject(err);
            });


        return deferred.promise;

      }
  };

  return myService;

});

//用法

myService.retrive(id,type).then(function(data){
// data retrived
})

答案 1 :(得分:-1)

角度js中的

用于返回来自后端的响应。在代码retrievedData中,在响应来自后端之前返回。这就是角度使用承诺的原因。所以当响应来自后端时,它执行成功块,成功块使用deferred.resolve(data)解析承诺。当错误发生时,错误块获取执行并拒绝承诺deferred.reject(err)。但是当它解析承诺时它会返回响应数据。

服务代码:

app.factory("myService", function ($http,$q) {
var myService = {
    retrieve: function (id, type) {
        var deferred = $q.defer();
        var retrievedData = {
            device: {},
            childDevices: [],
            error: {}
        };

        $http.get(url, headers).then(function (data) {
                // after success this block execute
                deferred.resolve(data);
            },
            function (err) {
              //after error this block execute
                deferred.reject(err);
            });


        return deferred.promise;

    }
};

return myService;
});

控制器代码:

//calling retrive function 
myService.retrive(id,type).then(fucntion(data){
  ...
})
.catch(function(){
...
})