【问题标题】:Intercepting $http responses and passing back new brand new responses拦截 $http 响应并传回全新的响应
【发布时间】:2017-07-10 05:03:41
【问题描述】:

我正在创建一个必须支持多个支付网关的电子商务商店。其中一个支付网关包括澳大利亚国家银行,它不包括与 HTTP 代码和 JSON 通信的 API。相反,即使事务失败,它也会仅以文本和状态 200 进行响应。

在我的应用程序中,我使用 $http 提供程序来处理这些响应,但它总是会触发成功函数,因此我需要在决定它是成功还是失败之前以某种方式拦截响应。

设置方法如下:

// 控制器

PaymentService.submit(payment_info).then(function(resp){
  // Do stuff on success
})

// PaymentService#submit

payment.submit = function(data) {
  var strategy;

  // general payment codez

  if (CURRENT_COUNTRY == 'au') {
    strategy = PaymentStrategy.nab.submit(card.number, card.cvv, card.exp_year, card.exp_month);
  }

  return strategy;
}

// PaymentStrategy.nab#submit

service.submit = function(number, cvv, exp_year, exp_month) {

  // payment codez specific to NAB

  return $http.post(resource_path, $httpParamSerializerJQLike(payload), { headers: headers })
}

所以问题在于 PaymentService.submit 是从 PaymentStrategy.nab 传回的承诺。但是,该承诺将始终触发成功回调,因为即使付款失败,响应也始终为 200(那是澳大利亚国民银行当前系统的工作。它应该使用 HTML 表单提交)。

我希望 PaymentService.submit 方法适用于任何支付网关 - 所以我需要传递回的承诺始终表现相同。这些独特的配置应该出现的唯一地方是在他们自己的策略中。

说了这么多,我如何才能从 NAB 获得响应,规范化该响应,然后将另一个适当的响应返回到整个链中?

【问题讨论】:

  • 要将成功的承诺转换为被拒绝的承诺,请在成功处理程序中抛出一个值。要将被拒绝的承诺转换为成功的承诺,返回 一个值给.catch 处理程序。见Angular execution order with $q

标签: angularjs angular-http angular-http-interceptors


【解决方案1】:

要将成功的承诺转换为被拒绝的承诺,在成功处理程序中抛出一个值。要将被拒绝的承诺转换为成功的承诺,返回一个值给.catch 处理程序。

return $http.get(url).then(function(response) {
    if (response.data.transactionFailed) {
        //THROW to convert to rejection;
        throw response;
    };
    //OTHERWISE return to chain response
    return response;
});

promise 的 .then 方法返回一个 new promise,它解析返回的内容(或被抛出的内容拒绝)。

更多信息

【讨论】:

  • 你。是。这。男人或女人)!谢谢!强调“the”。
猜你喜欢
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多