我正在创建一个必须支持多个支付网关的电子商务商店。其中一个支付网关包括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获得响应,规范化响应,然后将另一个正确的响应反馈回链中?
答案 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
方法返回新承诺,该承诺解析为返回的内容(或被抛出的东西拒绝)。
了解更多信息