Angular $q.defer() returns Object{then: function}



我有以下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( ... );

返回承诺。

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

会起作用的。

在Angular $scope.PortfolioItems = portfolioFactory.getResponse();的旧版本中也会起作用,但在较新的版本中,Angular不再自动打开承诺。

promise基本上是处理异步操作(一种设计模式)的另一种更好的方式。您可以使用promise.then( callback )将回调放入队列中,而不是以常规方式使用回调。然后,无论何时调用deferred.resolve方法,都会调用带有结果的回调。如果promise在排队的回调之前已经解析,则会立即使用缓存的数据调用它们。这比编写经常变成回调地狱的query( callback )代码要好得多。

仅供参考,你宁愿这样做,因为任何$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;
});

您应该能够调用"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);
    };
});

最新更新