工厂内 AngularJS promises 的问题

Issue with AngularJS promises within a factory

我有一个这样的 angularjs 工厂:

'use strict';

angular.module('frontRplApp')
    .factory('paymentService', function ($rootScope, $http, config, tools) {
        var urlBase = config.baseUrl;
        var paymentService = {

            response: {},

            create: function () {

                var args = {};

                return $http.post(urlBase + 'api/investor/payment/create', args);
            }
    });

我打算在这样的控制器中使用它(重要的问题是如果一切顺利或出现错误,则做一些不同的事情)

$scope.order = function () {
            console.log('PaymentCashCtrl.order');
            $scope.disabledButtons.submitCashOrder = true;

            paymentService.create()
                    .then(
                            function (response) {
                                // do something with response


                            }, function (error) {
                                // do something with an error
                        }));
        };

但是我的问题是,我想更新一些 paymentService 字段,因为 $http.post 的响应已解决,然后 return 承诺,以便功能(响应)和功能(错误)控制器中的回调继续工作。

我试过类似的东西:

return $http.post(urlBase + 'api/investor/payment/create', args)
                        .then(function(response){
                            console.log(response);
                            this.response = response;
                            return response;
                        });

但它不起作用,因为从未调用控制器中的函数(错误)处理程序。

我想在控制器中使用我的处理程序,但也想在 $http.post 响应得到解决时进行一些更新。

谢谢。

使用$q

将您的工厂代码更改为:

angular.module('frontRplApp')
    .factory('paymentService', function ($rootScope, $http, config, tools, $q) {
        var urlBase = config.baseUrl;
        var paymentService = {

            response: {},

            create: function () {
                var deferred = $q.defer();
                var args = {};

                $http.post(urlBase + 'api/investor/payment/create', args)               
                .then(function(response){
                        console.log(response);
                        paymentService.response = response;
                        deferred.resolve(response);
                    }, function (error) {
                         deferred.reject(error);
                    });
                return deferred.promise;
            }
         };

      return paymentService;
    });

在工厂中,您需要 return 函数 paymentService 对象。另外,不要解决工厂内部的承诺。在控制器中解决。

.factory('paymentService', function($rootScope, $http, config, tools) {
    var urlBase = config.baseUrl;
    var paymentService = {

        response: {},

        create: function() {

            var args = {};

            return $http.post(urlBase + 'api/investor/payment/create', args);
        }
    }

    return paymentService;
});

$scope.order = function() {
    console.log('PaymentCashCtrl.order');
    $scope.disabledButtons.submitCashOrder = true;

    paymentService.create()
        .then(
            function(response) {
                // do something with response


            },
            function(error) {
                // do something with an error
            }));
};