拦截 $http 响应并传回全新的全新响应

Intercepting $http responses and passing back new brand new responses

我正在创建一个必须支持多个支付网关的电子商务商店。这些支付网关之一包括澳大利亚国民银行,它不包括与 HTTP 代码和 JSON 通信的 API。相反,它仅以文本和状态 200 响应,即使交易失败也是如此。

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

设置方法如下:

// 控制器

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

// 支付服务#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#提交

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 获得响应,使该响应正常化,然后沿着链返回另一个正确的响应?

要将成功的承诺转换为拒绝的承诺,在成功处理程序中抛出一个值。要将拒绝的承诺转换为成功的承诺,return 一个值到 .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;
});

承诺的 .then 方法 return 是一个 new 承诺,解决了 returned 的内容(或被拒绝的内容抛出)。

了解更多信息