欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解微信小程序 同步异步解决办法

程序员文章站 2023-12-10 18:29:34
详解微信小程序 同步异步解决办法 小程序中函数体还没有完成,下一个函数就开始执行了,而且两个函数之间需要传参。那是因为微信小程序函数是异步执行的。但微信小程序增加了es6...

详解微信小程序 同步异步解决办法

小程序中函数体还没有完成,下一个函数就开始执行了,而且两个函数之间需要传参。那是因为微信小程序函数是异步执行的。但微信小程序增加了es6的promise特性支持,微信小程序新版本中移除了promise的支持,需要自己使用第三方库来自行实现es6的promise特性。

wxservice.js

import tools from 'tools'
import es6 from '../assets/plugins/es6-promise'

class service {
 constructor() {
  this.__init()
 }

 /**
  * __init
  */
 __init() {
  this.tools = new tools
  this.__initdefaults()
  this.__initmethods()
 }


 /**
  * __initdefaults
  */
 __initdefaults() {
  // 缓存非异步方法
  this.nopromisemethods = [
   'stoprecord',
   'pausevoice',
   'stopvoice',
   'pausebackgroundaudio',
   'stopbackgroundaudio',
   'shownavigationbarloading',
   'hidenavigationbarloading',
   'createanimation',
   'createcontext',
   'hidekeyboard',
   'stoppulldownrefresh',
  ]

  // 缓存wx接口方法名
  this.instancesource = {
   method: object.keys(wx)
  }
 }

 /**
  * 遍历wx方法对象,判断是否为异步方法,是则构造promise
  */
 __initmethods() {
  for (let key in this.instancesource) {
   this.instancesource[key].foreach((method, index) => {
    this[method] = (...args) => {
     // 判断是否为非异步方法或以 wx.on 开头,或以 sync 结尾的方法
     if (this.nopromisemethods.indexof(method) !== -1 || method.substr(0, 2) === 'on' || /\w+sync$/.test(method)) {
      return wx[method](...args)
     }
     return this.__defaultrequest(method, ...args)
    }
   })
  }

    /**
     * 保留当前页面,跳转到应用内的某个页面
     * @param {string} url 路径
     * @param {object} params 参数
     */
  this.navigateto = (url, params) => {
   const $$url = this.tools.buildurl(url, params)
   return new es6.promise((resolve, reject) => {
    wx.navigateto({
     url: $$url,
     success: res => resolve(res),
     fail: res => reject(res),
    })
   })
  }

  /**
  * 关闭当前页面,跳转到应用内的某个页面
  * @param {string} url 路径
  * @param {object} params 参数
  */
  this.redirectto = (url, params) => {
   const $$url = this.tools.buildurl(url, params)
   return new es6.promise((resolve, reject) => {
    wx.redirectto({
     url: $$url,
     success: res => resolve(res),
     fail: res => reject(res),
    })
   })
  }
 }

 /**
  * 以wx下api作为底层方法
  * @param {string} method 方法名
  * @param {object} obj  接收参数
  */
 __defaultrequest(method = '', obj = {}) {
  return new es6.promise((resolve, reject) => {
   obj.success = (res) => resolve(res)
   obj.fail = (res) => reject(res)
   wx[method](obj)
  })
 }
}

export default service

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!