uni.requestPayment的success里面不能调用其他函数吗?


uni.requestPayment的success里面不能调用其他函数吗?其他地方都可以通过this.recharge()调用,在uni.requestPayment里面使用报错,this也用不了。
requestPayment(params) {
  uni.requestPayment({
    nonceStr: params.nonceStr,
    package: params.package,
    paySign: params.paySign,
    signType: params.signType,
    timeStamp: params.timeStamp,
    success(res) {
      this.recharge()
      uni.$showSuccMsg('支付成功!')
    },
    fail(err) {
      uni.$showErrorMsg('支付失败!')
      console.error('pay fail', err)
    }
  })
},

因为在这个success()中,this不是指向全局对象,而是指向umi对象。为了使用,需要改成:

requestPayment(params) {
const that = this; // 定义一个that,指向全局对象
  uni.requestPayment({
    nonceStr: params.nonceStr,
    package: params.package,
    paySign: params.paySign,
    signType: params.signType,
    timeStamp: params.timeStamp,
    success(res) {
      that.recharge() // 通过that调用全局对象上的recharge()方法
      uni.$showSuccMsg('支付成功!')
    },
    fail(err) {
      uni.$showErrorMsg('支付失败!')
      console.error('pay fail', err)
    }
  })
},


感谢,之前不太理解const that = this的意义,学习到了。对箭头函数、this指向 也有更多的了解了

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    在小程序的success回调函数中无法直接调用其他函数的原因是,在该回调函数中调用的其他函数是在另一个作用域中执行的,而不是在界面页面的作用域中执行的。为了解决这个问题,我们可以使用uni.showModal函数在success回调函数中弹出一个提示框,提示用户支付成功。下面是具体的代码实现:

    uni.requestPayment({
      'provider': 'wxpay',
      'timeStamp': timeStamp,
      'nonceStr': nonceStr,
      'package': wxPackage,
      'signType': 'MD5',
      'paySign': paySign,
      'success': function(res) {
        uni.showModal({
          title: '支付成功',
          content: '恭喜您,支付成功!',
          showCancel: false,
          success: function() {
            // do something...
          }
        });
      },
      'fail': function(res) {
        uni.showModal({
          title: '支付失败',
          content: '很遗憾,支付失败!',
          showCancel: false,
          success: function() {
            // do something...
          }
        });
      }
    });
    

    在上面的代码中,我们先调用uni.requestPayment函数来进行支付操作,在支付成功或失败的回调函数中分别调用uni.showModal函数来弹出提示框。在uni.showModal函数的success回调函数中,您可以根据需要执行一些其他操作。

    为了让代码更加简洁和易读,还可以将弹窗函数封装成一个单独的函数,然后在uni.showModal函数的success回调函数中调用该函数实现提示用户支付成功。下面是相应的代码实现:

    function showModal(title, content) {
      uni.showModal({
        title: title,
        content: content,
        showCancel: false,
        success: function() {
          // do something...
        }
      });
    }
    
    uni.requestPayment({
      'provider': 'wxpay',
      'timeStamp': timeStamp,
      'nonceStr': nonceStr,
      'package': wxPackage,
      'signType': 'MD5',
      'paySign': paySign,
      'success': function(res) {
        showModal('支付成功', '恭喜您支付成功!');
      },
      'fail': function(res) {
        showModal('支付失败', '很遗憾支付失败!');
      }
    });
    

    在上述代码中,我们定义了一个名为showModal的函数,该函数用于弹出提示框,接受两个参数,分别是提示框的标题和内容。然后我们在uni.requestPayment函数的回调函数中调用showModal函数来实现弹出提示框的功能,代码更加简洁、易读。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^