gpt4 book ai didi

javascript - Angular $q.defer() 返回 Object{then : function}

转载 作者:行者123 更新时间:2023-11-30 12:52:26 24 4
gpt4 key购买 nike

我有以下 Angular 文件,我在其中尝试使用 $http 访问数据库,然后在 $scope 变量中使用此数据(以显示在网页中)。问题是我无法让 $q.defer 像我认为的那样运行。 $http 函数中的 console.log() 记录一个包含从数据库返回的数据的对象。但是,当我调用该函数时,它会记录 Object {then: function}。数据包含在此对象中,但它不是对象的唯一部分。 (好像是在 Object.$$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);
});

最佳答案

$http.get( ... );

返回 promise .

app.controller("PortfolioCtrl", function($scope, portfolioFactory) {
portfolioFactory.getResponse().then(function(response) {
$scope.PortfolioItems = response.data;
})
});

会起作用。

在 Angular 的旧版本中 $scope.PortfolioItems = portfolioFactory.getResponse();也可以工作,但在较新的版本中,Angular 不再自动解包 promise 。

Promise 基本上是处理异步操作的另一种更好的方式(design pattern)。您可以使用 promise.then( callback ) 将回调放入队列中,而不是以常规方式使用回调。然后,无论何时调用 deferred.resolve 方法,都会使用结果调用回调。如果 promise 已经在排队的回调之前得到解决,它们将立即使用缓存数据调用。比执行经常变成 callback hellquery( callback ) 代码要好得多.

仅供引用,您宁愿这样做,因为任何 $http 调用的结果已经是一个 promise :

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

关于javascript - Angular $q.defer() 返回 Object{then : function},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20484146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com