【发布时间】: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