我有以下Angular文件,我尝试使用$ http访问数据库,然后在$ scope变量中使用此数据(显示在网页中)。问题是我无法获得$ q.defer,因为我认为它应该运行。 $ http函数中的console.log()记录包含从数据库返回的数据的对象。但是,当我调用该函数时,它会记录Object {then: function}
。数据包含在此对象中,但它不是对象的唯一部分。 (好像它在对象中。$$ v。我不确定这意味着什么。)
var app = angular.module("app", []);
app.factory('portfolioFactory', function ($http, $q) {
var obj = {};
obj.getResponse = function(){
var deferred = $q.defer();
$http.get('./../includes/portfolio/db_access.php').success(function(data){
deferred.resolve(data);
console.log(data);
});
//console.log(deferred.promise);
return deferred.promise;
}
return obj;
});
app.controller("PortfolioCtrl", function($scope, portfolioFactory) {
$scope.PortfolioItems = portfolioFactory.getResponse();
console.log($scope.PortfolioItems);
});
答案 0 :(得分:3)
$http.get( ... );
返回promise。
app.controller("PortfolioCtrl", function($scope, portfolioFactory) {
portfolioFactory.getResponse().then(function(response) {
$scope.PortfolioItems = response.data;
})
});
会工作吗?
旧版Angular $scope.PortfolioItems = portfolioFactory.getResponse();
也会有效,但在较新的版本中,Angular不再自动展开承诺。
承诺基本上是处理异步操作的另一种更好的方式(design pattern)。
您可以将回调放入promise.then( callback )
的队列中,而不是以常规方式使用回调。然后,每当调用deferred.resolve方法时,都会使用结果调用回调。如果在排队的回调之前已经解决了promise,则会立即使用缓存数据调用它们。比执行query( callback )
的{{1}}代码要好得多。
仅供参考,你可能宁愿这样做,因为任何$http
电话的结果已经是一个承诺:
app.factory('portfolioFactory', function ($http) {
var obj = {};
obj.getResponse = function(){
return $http.get('./../includes/portfolio/db_access.php').then(function(data){
console.log(data);
return data; //Return data further up the chain.
});
}
return obj;
});
答案 1 :(得分:0)
您应该可以调用“then”函数来获取数据。
app.controller("PortfolioCtrl", function($scope, portfolioFactory) {
$scope.PortfolioItems = portfolioFactory.getResponse();
$scope.PortfolioItems.then(function(results){
console.log(results);
};
});
它可能会拼出来标记这样的东西......
app.controller("PortfolioCtrl", function($scope, portfolioFactory) {
$scope.PortfolioItems = null;
var fetchPortfolioItems = portfolioFactory.getResponse();
fetchPortfolioItems.then(function(results){
$scope.PortfolioItems = results;
console.log($scope.PortfolioItems);
};
});