uni-app restoreComplateRequest拿不到丢的单
uni-app restoreComplateRequest拿不到丢的单
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | win10 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:win10
HBuilderX类型:正式
HBuilderX版本号:3.4.12
手机系统:iOS
手机系统版本号:iOS 15
手机厂商:苹果
手机机型:Iphonex
页面类型:vue
vue版本:vue2
打包方式:云端
示例代码:
function restoreComplateRequest() {
if(appleIap){
console.log("restoreComplateRequest 有appleIap");
appleIap.restoreComplateRequest({}, function(results) {
console.log("results");
console.log(results);
});
}else{
plus.payment.getChannels(function(channels) {
for (var i in channels) {
var channel = channels[i];
if (channel.id === 'appleiap') {
appleIap = channel;
console.log(appleIap);
console.log(appleIap.restoreComplateRequest);
appleIap.restoreComplateRequest({}, function(results) {
console.log(results);
} );
}
}
}, function(e) {});
}
}
操作步骤:
内购
预期结果:
不丢单
实际结果:
丢单
bug描述:
当app在用户未绑定支付方式时,及支付完成app退出了时,再次进入app在onshow方法调用restoreComplateRequest拿不到丢的单,打印出来是空数组,这个问题必现! 请复查,支付参数也带了optimize: true
2 回复
bugbugbugbugbugbugbugbugbugbug
在 uni-app 中,restoreComplateRequest
是一个用于恢复未完成的网络请求的方法。如果你在使用 restoreComplateRequest
时无法获取到丢失的请求,可能是由于以下几个原因:
1. 请求未正确保存
restoreComplateRequest
依赖于uni.addInterceptor
拦截器来保存未完成的请求。如果请求没有被正确保存,restoreComplateRequest
就无法恢复这些请求。- 确保你在应用启动时正确配置了拦截器,并且在请求发出时拦截器能够正常工作。
uni.addInterceptor('request', {
invoke(args) {
// 保存请求
uni.setStorageSync('pendingRequest', args);
},
success(res) {
// 请求成功后的处理
},
fail(err) {
// 请求失败后的处理
},
complete(res) {
// 请求完成后的处理
}
});
2. 请求未在合适的时机恢复
restoreComplateRequest
需要在合适的时机调用,例如在应用重新启动或网络恢复时。如果你在错误的时机调用它,可能会导致无法恢复请求。- 确保你在应用重新启动或网络恢复时调用
restoreComplateRequest
。
uni.onNetworkStatusChange((res) => {
if (res.isConnected) {
uni.restoreComplateRequest();
}
});
3. 请求数据丢失
- 如果请求数据在保存过程中丢失(例如,由于存储空间不足或存储操作失败),
restoreComplateRequest
也无法恢复这些请求。 - 确保你在保存请求数据时没有发生错误,并且存储空间充足。
try {
uni.setStorageSync('pendingRequest', args);
} catch (e) {
console.error('保存请求失败', e);
}
4. 请求恢复逻辑错误
- 如果你在恢复请求时逻辑有误,可能会导致请求无法正确恢复。例如,你可能需要重新设置请求的
header
或data
。 - 确保你在恢复请求时正确处理了请求的各个部分。
const pendingRequest = uni.getStorageSync('pendingRequest');
if (pendingRequest) {
uni.request({
url: pendingRequest.url,
method: pendingRequest.method,
data: pendingRequest.data,
header: pendingRequest.header,
success(res) {
// 请求成功后的处理
},
fail(err) {
// 请求失败后的处理
}
});
}