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

时间:2017-07-09 20:21:31

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

我正在创建一个必须支持多个支付网关的电子商务商店。其中一个支付网关包括National Australian Bank,它不包含与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获得响应,规范化响应,然后将另一个正确的响应反馈回链中?

1 个答案:

答案 0 :(得分: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;
});

承诺的.then方法返回承诺,该承诺解析为返回的内容(或被抛出的东西拒绝)。

了解更多信息