[英]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.