【问题标题】:angularjs get the error message from the service to the controllerangularjs 从服务获取错误信息到控制器
【发布时间】:2016-05-22 19:02:32
【问题描述】:

使用 REST 获取费率的工厂

.factory('rateResource', ['$resource', function ($resource) {
    return $resource('/rates/:currency/:effectiveDate', {
        currency: '@currency',
        effectiveDate: '@effectiveDate'
    });
}])

调用工厂以获取资源并检索费率以及错误(如果有)的服务。

 .service('RateService', ['rateResource', '$rootScope',
    function (rateResource, $rootScope) {
        var self = this;

        self.rates = [];

        self.search = function (baseCurrency, effectiveDate) {
            self.rates = [];
            var error = null;
            self.baseCurrency = baseCurrency;
            self.effectiveDate = effectiveDate;
            if (baseCurrency) {
                rateResource.query({currency: baseCurrency, effectiveDate: effectiveDate})
                    .$promise.then(function (rates) {
                        if (rates) {
                            angular.forEach(rates, function (rate) {
                                rate.maintTs = $rootScope.formatTimestampToHHMMSS(rate.maintTs);
                                rate.editable = false;
                                self.rates.push(rate);
                            });
                            self.processing = false;
                        }
                    }, function (response) {
                        self.processing = false;
                        error = 'Processing failed due to '+response.status;
                        console.log(error);
                    })
                return {
                    rates: self.rates,
                    errors: error
                }
            }
        }
    }]);

控制器调用服务以获取费率。

.controller('RateController', ['RateService',
    function (rateService) {
        var self = this;

        self.baseCurrency = rateService.getBaseCurrency();
        self.effectiveDate = rateService.getEffectiveDate();
        self.rates = rateService.getRates();

        //make the call from the controller
        self.search = function () {
            var response = rateService.search(self.baseCurrency, self.effectiveDate.yyyyMMdd());
            self.rateRecords = response.rates;
            self.errors = response.errors;
        }
    }])

兑现承诺后,控制器中的费率显示正常。但是,在收到错误后,它们不会从服务转移到控制器。 (我更改了 REST URL 以使服务返回 404 响应)。我做错了什么?

【问题讨论】:

  • 你无法在 Promise 函数之外获得 self.rates 值。因为它们是异步填充的。
  • self.rates 对我来说工作正常;兑现承诺后,我可以通过控制器在显示屏上看到费率。问题在于错误
  • 哦.. self.rates 工作正常,因为您传递了self.rates 参考.. 您在说什么错误..?
  • 我想传递 error = 'Processing failed due to '+response.status;消息给控制器。我通过向无效的 url 发出请求来模拟 404,但是错误没有发送到控制器。
  • 看看我添加的答案。

标签: javascript angularjs angularjs-service angularjs-resource


【解决方案1】:

目前您正在从异步函数外部返回异步调用响应,从技术上讲,您不应该这样做。异步代码总是在它们的promise/callback 函数中得到响应。

但在您的情况下,它正在工作,因为您正在返回带有它引用的对象。如果你看下面的代码,return 语句已经携带了self.rates 对象引用,所以在返回时即使它是空白的,一旦self.rates 被填满,它就会得到更新的值。因此,您无需担心rates 更新。但是同样的错误不会起作用,因为它是原始的datatype,就像var error = null,所以当你返回值时,它会是null(因为异步响应还没有完成)。

return {
     rates: self.rates, //passed by reference
     errors: error //passed by primitive type
}

因此,为了解决此问题,您还可以将错误设置为 object 类型,以便它的引用将与引用对象一起传递,例如 var errors = [] & 当发生错误时,使用 @987654333 将错误消息推送到该数组中@


但我不建议采用上述方式,我宁愿使用承诺模式,并且会维护适当的代码调用堆栈。基本上,您需要从search 方法返回承诺,然后将.then 函数放入等待解决该函数。

服务

.service('RateService', ['rateResource', '$rootScope',
    function(rateResource, $rootScope) {
      var self = this;
      self.rates = [];
      self.search = function(baseCurrency, effectiveDate) {
        self.rates = [];
        var error = null;
        self.baseCurrency = baseCurrency;
        self.effectiveDate = effectiveDate;
        if (baseCurrency) {
          return rateResource.query({
            currency: baseCurrency,
            effectiveDate: effectiveDate
          })
            .$promise.then(function(rates) {
            if (rates) {
              angular.forEach(rates, function(rate) {
                rate.maintTs = $rootScope.formatTimestampToHHMMSS(rate.maintTs);
                rate.editable = false;
                self.rates.push(rate);
              });
              self.processing = false;
            }
            //returning object from promise
            return {
              rates: self.rates,
              errors: error
            }
          }, function(response) {
            self.processing = false;
            error = 'Processing failed due to ' + response.status;
            console.log(error);
            //returning object from promise
            return {
              rates: self.rates,
              errors: error
            }
          })
        }
      }
    }
])

控制器

//make the call from the controller
self.search = function() {
  var response = rateService.search(self.baseCurrency, self.effectiveDate.yyyyMMdd()).then(function() {
    self.rateRecords = response.rates;
    self.errors = response.errors;
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多