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