如何将已解决的承诺传递给AngularJS中的范围?

时间:2016-12-18 12:08:43

标签: javascript angularjs

所以我开始使用AngularJS,目前正在考虑承诺。所以我的旧代码看起来像这样:

app.controller('CustomerController', function ($scope Customers, $q) {
    init();

    function init() {
        Customers.getCustomers()
        .then(function (response) {
            $scope.customers = response.data;
        }, function (error) {
            console.log(error);
        });
    }
});

app.factory('Customers', function ($http) {
    return {
        getCustomers: function () {
            return $http.get('/api/customers');
        }
    };
});

所以我在init函数中做出的承诺是这样的:

function init() {
    var deferred = $q.defer();
    Customers.getCustomers()
    .then(function (response) {
        deferred.resolve(response.data); // how to pass this into my scope?
    }, function (error) {
        deferred.reject(error);
    });
     return deferred.promise;
}

如您所见,我无法将其传递到我的范围。我在这里做错了吗?

2 个答案:

答案 0 :(得分:0)

我不确定你在这里做什么。但是在控制器中使用这样的promises是没有意义的。你需要在其他地方调用你的init函数:

init().then(response => $scope.data = response);

在工厂的旧代码中,$ http服务的get方法返回一个promise,你正确处理控制器中的响应。

答案 1 :(得分:0)

考虑到Angular的$ http服务已经返回了一个promise。 $ http API基于$ q服务公开的延迟/承诺API。 所以你可以这样:

app.controller('CustomerController', function ($scope, Customers) {
    init();

    function init() {
        Customers.getCustomers()
        .then(function (data) {
            $scope.customers = data;
        }, function (error) {
            console.log(error);
        });
    }
});

app.factory('Customers', function ($http) {
    return {
        getCustomers: function () {
            var promise = $http.get('/api/customers').
                then(function(response){
                        return response.data;
                    }, 
                    function(error) {
                        return response.error;
                    }
                )

            return promise;
        }
    };
});