uni-app restoreComplateRequest拿不到丢的单

发布于 1周前 作者 caililin 来自 Uni-App

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. 请求恢复逻辑错误

  • 如果你在恢复请求时逻辑有误,可能会导致请求无法正确恢复。例如,你可能需要重新设置请求的 headerdata
  • 确保你在恢复请求时正确处理了请求的各个部分。
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) {
      // 请求失败后的处理
    }
  });
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!