如何在 JavaScript if 条件中处理 Paylike popup 的 closed 值
支付小周
结论
"closed" 是回调函数 err 参数的值,需要在处理其他错误之前判断:
function (err, res) {
if (err === 'closed') {
window.location.href = '/preview';
return;
}
if (err) {
console.error(err);
return;
}
const txn = res.transaction.id;
console.log(txn);
// 继续处理支付成功逻辑
}
原因
原代码有三个问题:
console.log(err)只会输出内容,它的返回值是undefined,不能用来获取"closed":
var action = console.log(err); // action 是 undefined
- 回调函数一开始遇到
err就会执行return:
if (err)
return console.log(err);
因此,当 err 为 "closed" 时,函数已经结束,后面的判断没有机会执行。
if (action = 'closed')中的=是赋值运算符,不是比较运算符。严格比较应该使用===:
if (action === 'closed') {
// ...
}
推荐写法
先处理 popup 被关闭的情况,再处理其他错误。没有错误时,继续执行支付成功逻辑:
function (err, res) {
if (err === 'closed') {
// Popup 被用户关闭
window.location.href = '/preview';
return;
}
if (err) {
// 其他错误
console.error('Payment error:', err);
return;
}
// 支付成功
const txn = res.transaction.id;
console.log('Transaction ID:', txn);
// 后续业务逻辑
}
把 '/preview' 换成实际的 preview page 地址,例如:
window.location.href = '/checkout/preview';
如果 preview page 是浏览器历史记录中的上一页,也可以使用:
window.history.back();
不过,history.back() 依赖用户的浏览历史,上一页未必是 preview page。在业务流程中,使用明确的 URL 通常更可靠。
如果 err 不是字符串
上面的代码假设 err 的实际值是字符串 "closed"。如果控制台显示的是一个对象,例如:
{
message: 'closed'
}
就需要判断对象中的对应属性:
if (err && err.message === 'closed') {
window.location.href = '/preview';
return;
}
可以先查看 err 的真实类型和结构:
console.log(err);
console.log(typeof err);
不要根据 console.log() 的返回值进行判断。应该直接判断回调参数 err,或者判断它的具体属性。
备注:内容仅供参考。
