繁体   English   中英

angularjs-无法从工厂返回数据

[英]angularjs - Trouble returning data from a factory

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

我的工厂函数如下所示:

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));
});

不用担心'get users 1 etc etc'字符串,我在php中创建了一个函数,该函数根据给定的参数呈现SQL查询。 我的工厂代码中是否需要改进?

我建议从工厂退回诺言,而改为在控制器中处理成功和错误事件。

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);
   });
});

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...');
     });

});

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

您可以通过两种方式检索数据:

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

如你所知,$ http服务回报承诺,并有一定的回调方法,如.success()。那么()为例。

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

$ q.defer()得到2种方法:

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

  • reject(reason):解决承诺错误。

所以你可以做:

服务

(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);

})();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM