我尝试创建一个数据库工厂,在成功发布数据后将数据从数据库返回到客户端,但它返回为“未定义”。由于某些原因。
我的工厂功能如下:
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查询。我的工厂代码中有什么东西我需要改进吗?
答案 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);
})();
但我该怎么用?我认为使用承诺比回调更好,因为您可以轻松处理您的请求。此外,您可以执行承诺链接,并避免使用着名的回调地狱。