簡體   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