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

时间:2013-12-10 01:09:23

标签: javascript angularjs

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

2 个答案:

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