angularjs - 无法从工厂返回数据

时间:2015-08-27 22:25:06

标签: javascript angularjs

我尝试创建一个数据库工厂,在成功发布数据后将数据从数据库返回到客户端,但它返回为“未定义”。由于某些原因。

我的工厂功能如下:

uno.factory('adbFactory', ['$http', function($http){

    var fact = {};

    fact.get = function(http, query, isAll) {
        //var query = "get all blog_posts";
        http.post('php/adb/adb.php', {'query': query, 'all': isAll})
        .success(function(data){
            //console.log(data);
            return data;
        })
        .error(function(){
            console.log('Error...');
        });
    };

    return fact;

}]);

我的控制器类似于:

uno.controller('newsCtrl', function($scope, $http, adbFactory){
    $scope.derp = 'derp!!!!!';
    console.log(adbFactory.get($http, 'get users 1', false));
});
不要担心“获得用户1等”等等。我在php中创建了一个函数,它根据给定的参数呈现SQL查询。我的工厂代码中有什么东西我需要改进吗?

3 个答案:

答案 0 :(得分:1)

我建议从工厂返回承诺,并在控制器中处理成功和错误事件。

fact.get = function(http, query, isAll) {
    return http.post('php/adb/adb.php', {'query': query, 'all': isAll});
};

uno.controller('newsCtrl', function($scope, $http, adbFactory){
   adbFactory.get($http, 'get users 1', false).success(function(data) {
       console.log(data);
   });
});

答案 1 :(得分:1)

fact.get方法没有return语句,这就是它返回undefined的原因。

此外,这个回调是无用的,因为它被异步调用

.success(function(data){
   //console.log(data);
   return data;
 })

我想你想要一些像:

fact.get = function(http, query, isAll) {
   return http.post('php/adb/adb.php', {'query': query, 'all': isAll});
};


uno.controller('newsCtrl', function($scope, $http, adbFactory){    

    adbFactory
    .get($http, 'get users 1', false)
    .success(function(data){
         console.log(data);
     })
     .error(function(){
         console.log('Error...');
     });

});

答案 2 :(得分:1)

您必须记住,您正在执行某些异步请求。

您有两种方法可以检索数据:

  • 遵循回调方式
  • 遵循承诺方式

如您所知, $ http 服务返回承诺,并有一些回调方法,例如 .success() .then()例如。

对于承诺, $ q.defer()是来自延期API 承诺管理器

$ q.defer()获取2种方法:

  • resolve(value):通过给她最终值来解决我们的相关承诺

  • 拒绝(原因):解决了承诺错误。

所以你可以这样做:

<强>服务

(function(){

  function Service($http, $q){

    var defer = $q.defer();

    //Callback way
    function get(callback){
      $http.get('app.php').success(function(data){
        //Pass our data to the callback
        callback(data);
      });
    }

    //Promise ways
    function getPromise(){
      $http.get('app.php').success(function(data){
        //Resolve the data
        defer.resolve(data);
      });
      //Return our promise
      return defer.promise;
    }

    return {
      get: get,
      getPromise: getPromise
    };

  }

  angular
    .module('app')
    .factory('Service', Service);

})();

<强>控制器

(function(){

function Controller($scope, Service) {

  //Our callback method
  function print(data){
      console.log(data);
  }

  //Retrieve our data by using callback way
  Service.get(print);


  //Retrieve our data by using promise way
  var promise = Service.getPromise();

  //When promise is resolved
  promise.then(function(data){
    //Retrieve our data
    console.log(data);
  });

}

angular
.module('app', [])
.controller('ctrl', Controller);

})();

但我该怎么用?我认为使用承诺比回调更好,因为您可以轻松处理您的请求。此外,您可以执行承诺链接,并避免使用着名的回调地狱