2015-08-27 30 views
0

我試圖創建一個數據庫工廠,該數據庫在數據成功發佈後從數據庫返回數據到客戶端,但由於某種原因它返回爲「未定義」。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查詢。我的工廠代碼中有什麼需要改進?

回答

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

我可以console.log數據沒有問題,但它不返回到控制器。並通過回覆承諾,這意味着什麼? –

+0

我試圖澄清我的意思,但編輯我的評論。 – PsykoGert

+0

啊我看到這個解決了我!謝謝!!!! –

1

fact.get方法沒有return語句,這就是爲什麼它返回undefined

而且,這個回調是無用的,因爲它是被異步調用

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

我想你想要somethig這樣的:

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

}); 
+0

我會如何寫它?像return函數(){fact.get = function(){...}} –

1

你要記住,你是執行某些異步請求。

你有兩種方式來檢索數據:

  • 繼回調方式
  • 繼承諾方式

如你所知,$ HTTP的服務回報承諾,並有一些回調方法,如。成功()。然後()例如。

有關承諾,$ q.defer()遞延API一個承諾經理

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

  • 決心(值):它解決我們的相關承諾,給她終值

  • 拒絕(原因):這解決了承諾錯誤。

所以,你可以這樣做:

服務

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

})(); 

但我應該用什麼呢?我認爲使用承諾比回調要好,因爲你可以輕鬆處理你的請求。此外,您可以執行承諾鏈接,並避免着名的回撥地獄

+0

啊所以我明白了!它也似乎承諾保持嚴格的數據處理控制。我喜歡使用回調,儘管它似乎可以節省代碼,並且在某些情況下可以更容易地閱讀,但我清楚地理解它 –