微信小程序等待wx.requestPayment的回调函数执行完后再执行后续代码

在微信小程序开发中,遇到需要等待wx.requestPayment异步回调执行完成的需求。通过使用async函数和Promise,可以手动实现等待回调完成后再执行后续代码,确保支付成功或失败的正确处理。在doPayment函数中,创建新Promise并在回调函数中调用resolve或reject,从而控制流程。
摘要由CSDN通过智能技术生成

async/await & Promise的再认识

背景

在开发微信小程序过程中,遇到如下需求:

需要等待wx.requestPayment的回调函数执行完后再执行后续代码

这是因为在调用wx.requestPayment之后,会弹出一个支付弹窗,如果此时点击右上角的x,那么将会执行wx.requestPayment的回调函数fail中的代码。而由于wx.requestPayment的回调函数是异步执行的,所以程序会继续跑下去执行后面的代码。这会出现什么问题呢?

async fabu(){
    const res = await wx.requestPayment({
      ...params,
      success: function (res) {
        console.log('Payment success');
        //...(假设这里是支付成功后的代码)
      },
      fail: function (error) {
        console.log('Payment failed', error);
      }
    });
    //...(假设这里是支付成功后的代码)
}

1.如果我把支付成功后的代码写到wx.requestPayment的后面,那么在我点击了右上角的x后,程序会执行后续的代码,导致我明明没有支付却执行了支付成功的代码。

2.如果我把支付成功后的代码写到wx.requestPayment的回调函数(succes)里,那么会出现:在弹出弹窗等待用户进行支付操作之后,程序会继续执行wx.requestPayment后面的代码的现象,这会导致用户未完成支付操作,fabu()这个函数就已经执行完并返回结果了。

Solution

由于wx.requestPayment的回调函数是异步执行的,而且微信开发者工具不支持直接使用async/await等待回调函数的执行完成,所以无法直接通过在wx.requestPayment前加上await来等待回调函数执行完毕。

不过,可以使用Promiseresolve来手动实现等待回调函数执行完毕后再执行后续代码的效果。

async doPayment(params) {
    let that = this;
    try {
      const paymentResult = await new Promise((resolve, reject) => {
        wx.requestPayment({
          ...params,
          success: function (res) {
            console.log('Payment success');
            resolve(res); // 在成功回调函数中手动触发resolve,并传递回调数据
          },
          fail: function (error) {
            //如果不是耗时处理,处理支付失败的情况可以写在这
            console.log('Payment failed in', error);
            reject(error); // 在失败回调函数中手动触发reject,并传递错误信息
          }
        });
      });
      console.log('Continue with the next steps');
      // 在这里可以执行支付成功后的代码
    } catch (error) {
      //如果是耗时处理,处理支付失败的情况可以写在这
      console.log('Payment failed out', error);
    }
    console.log('这里是try catch块后面的代码');
  },

这里我们在doPayment函数中使用await new Promise来等待wx.requestPayment的完成,并获取支付结果。在成功情况下,输出"Payment success",然后可以执行后续代码。在失败情况下,输出"Payment failed"并打印错误信息,可以在catch块中处理支付失败的情况。

这样我们就能做到等待wx.requestPayment的回调函数执行完后再执行后续代码,如图所示:

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gavi曦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值