把微信小程序异步API为Promise,简化异步编程

时间: 2018-08-14阅读: 2592标签: 小程序

把微信小程序异步API转化为Promise。用Promise处理异步操作有多方便,谁用谁知道。
微信官方没有给出Promise API来处理异步操作,而官方API异步的又非常多,这使得多异步编程会层层回调,代码一复杂,回调起来就想砸电脑。
于是写了一个通用工具,把微信官方的异步API转化为Promise,方便处理(多)异步操作。

你可以这样用:

准备转化后的方法并暴露出

// /utils/wx-promise.js
import toPromise from '/module/to-promise/src/index'

const toPromiseWx = toPromsie(wx)

export const request = toPromiseWx('requset')
export const getLocation = toPromiseWx('getLocation')
export const setStorage = toPromiseWx('setStorage')

//export 其他你项目中可能用到的异步API


在其他文件中使用
在App.js中使用:

//App.js
import { request } from './utils/wx-promise.js'

App({
  onLanuch: () => {
    request({ url: 'http://api.yourapi.com' })
      .then(() => {
        //成功后处理
      })
      .then(() => {
        //失败后处理
      })
  }
})

在其他page中使用:

// /page/index.js
import { request, setStorage } from '../utils/wx-promise.js'

page({
  onLoad: () => {
    request({ url: 'http://api.yourapi.com' })
      .then(() => {
        //成功后处理
      })
      .then(() => {
        //失败后处理
      })
  },
  onHide: () => {
    setStorage({
      key: 'yourkey',
      data: 'yourvalue'
    })
      .then(() => {
        //保存成功
      })
      .then(() => {
        //保存失败
      })
  }
})

项目地址:to-promise

其他更多更具体用法,直接粘贴README了,如下。


to-promise是一个转换微信小程序异步API为Promise的一个工具

优点:

  1. 避免小程序异步编程多次回调带来的过多回调导致逻辑不清晰,篇幅过长等问题。
  2. 借助于Promise异步编程特点,支持链式操作,像同步一样写异步。
  3. 转化后得API几乎和微信官方API一样。

使用方法:

  1. 安装
  • 使用git安装到项目根目录/module,

git clone https://github.com/tornoda/to-promise
  • 或直接下载放入项目目录下如:/module
  1. 在需要用到的地方引入
import toPromise from '/module/to-promise/src/index'
  1. 绑定微信全局对象(wx)到函数,以便可以取到微信得API
const toPromiseWx = toPromise(wx)
  1. 开始转化你需要得异步API
//apiName为微信异步方法名,如对wx.request()进行转化
const request = toPromiseWx('request')
//直接使用request方法

举例:

import toPromise from '/module/to-promise/src/index'

//转换wx.getStorage()
const getStorage = toPromsie(wx)('getStorage') 

//使用
getStorage({ key: 'test' })
  .then(
    (res) => {
      //res的值与wx.getStorage({ success: (res) => {} })中的res值一样
      //res = {data: 'keyValue'}
      console.log(res.data)//控制台打印storage中key对于的value
      return res.data//如果需要继续链式调用转化后的api,需要把值显示返回
    },
    (err) => {
      //err的值与wx.getStorage({ success: (err) => {} })中的err值一样
      throw err
    }
  )

关于Promise对象的使用,请参见Promise

API

  • toPromise(global)

参数

(wx): wx全局对象。即toPromise(wx)这样调用

返回

(function): 参数(string)为小程序异步方法名。返回一个函数,该函数的参数与返回值如下。

参数:(object) 对应wx小程序异步方法中的参数(OBJECT)除去success与fail后的对象。例如: 官方APIwx.getLocation(OBJECT)的OBJECT接受如下属性: type altitude success fail complete,那么去除(success fail)后为:type altitude complete。

返回: (pending Promsise) 返回一个未知状态的Promise对象,在该对象上调用.then(onFulfilled, onRejected)方法来处理对用成功或失败的情况。onFulfilled为请求成功后调用的回调函数,参数为返回值,onRejected为请求失败后的回调函数,参数为返回的错误信息。

简单点来说,

const getLocation = toPromiseWx('getLocation')
getLocation({
  type: 'wgs84',
  altitude: true,
  complete: () => { console.log('to-promsise is awesome') }
}).then(
  (res) => {//dosomething if succeed},
  (err) => {//dosomething if failed}
)

与下面官方调用等价

wx.getLocation({
  type: 'wgs84',
  altitude: true,
  complete: () => { console.log('to-promsise is awesome') },
  success: (res) => {//dosomething if succeed},
  fail: (err) => {//dosomething if failed}
})

应用场景举例

  1. 单次异步调用,参见API最后
  2. 多次异步操作调用,且每下一次调用都会用到前一次返回的结果。
    如:获得GPS信息后,根据GPS信息获取天气信息,取得天气信息后立马存入localStorage。
import toPromise from '/module/to-promise/src/index'

const toPromiseWx = toPrmise(wx)

//方法转换
const getLocation = toPromiseWx('getLocation')
const request = toPromiseWx('request')
const setStorage = toPromiseWx('setStorage')

//链式写逻辑
getLocation() //获取位置信息
  .then(
    (res) => { //位置获取成功后的处理,res为返回信息
      //处理res后返回有用的信息,这里直接返回res,用于演示
      return Promise.resolve(res) //必须
    },
    (err) => { //位置获取失败后的错误处理,err为错误信息
      //错误处理
      return Promise.resolve(err) //必须
    }
  )
  .then(
    (res) => { //根据位置获取成功后的信息,请求天气信息
      return request({ url: 'http://api.weather.com'}) //返回一个pending 状态下的Promise
    }
  )
  .then(
    (res) => {  //天气获取成功后存入storage的回调
      setStorage({
        key: 'test',
        data: 'res'
      })
    },
    (err) => {
      //天气获取失败后执行这里,err为获取天气失败的错误信息
    }
  )

如果使用官方的API写上述逻辑,代码是这样的:

wx.getLocation({
  success: (res) => {
    //some transformation with res
    wx.request({
      url: 'http://api.weather.com',
      success: (res) => {
        wx.setStorage({
          success: () => {
            //do something
          },
          fail: (err) => {
            //do something if err happend
          }
        })
      },
      fail: (err) => {
        //do something if err happend
      }
    })
  },
  fail: (err) => {
    //do something if err happend
})
//层层回调,如果逻辑再复杂点,可能就疯了


来源:https://www.cnblogs.com/looyulong/archive/2018/08/13/9471424.html

站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/1004

微信小程序wx.getUserInfo授权获取用户信息

这个接口只能获得一些非敏感信息,例如用户昵称,用户头像,经过用户授权允许获取的情况下即可获得用户信息,至于openid这些,需要调取wx.login来获取。

小程序的节流与防抖

在屏幕滚动与拖拽的时候,经常会用到一些持续触发的事件,而这类事件不可控触发频率非常高,大大影响了性能,而我们想要让其变得可控,就可以用到节流和防抖两种方案。

手把手教你写个小程序定时器管理库

后台的定时器积累得越多,小程序就越卡,耗电量也越大,最终导致程序卡死甚至崩溃。特别是团队开发的项目,很难确保每个成员都正确清理了定时器。因此,写一个定时器管理库来管理定时器的生命周期,将大有裨益。

小程序返回上一个页面并更新上一个页面的数据

小程序开发过程中经常有这种需求,需要把当前页面数据传递给上一个页面,但是wx.navigateBack()无法传递数据。

扩展微信小程序 Page 构造函数,修改生命周期函数

微信小程序扩展: 将公共方法绑定到Page上、扩展,修改生命周期函数。将自定义的内容单独封装到一个js文件中,然后在app.js中引用这个文件即可

微信小程序开发中遇到的坑

开发小程序的过程中踩的坑不可谓不多,而有些坑也实在是让人郁闷,不扒一扒难以平我心头之愤呐。

小程序 showLoading与showToast不能共存

loading与toast一般不能同时引用,所以一般先把hideloading了,再执行showtoast,之前把hideloading加到了complete中,所以toast就一直出问题

小程序保存图片到相册功能实现

先检查用户请求过的权限中是否允许保存到相册权限,如果没有请求过这个权限,应该向用户发起授权请求(弹窗授权),如果请求过这个权限,并且授权了,那就保存图片,显示保存成功;如果请求过,但是是拒绝的,就跳到设置页,重新授权。

记一次小程序样式优化重构

在开发的过程中遇到了一些问题,但是最终减少了不少样式代码,同时功能上也更加强大。进一步来说,如果在后面我们的小程序用户想要自己定制化主题,也可以很快的实现。

微信小程序跑马灯效果--基于CSS3 animation

如果上面看懂了下面再深入一下,因为上面的只是应付一些简单的滚动(内容少的情况下),下面这是应对比较多的内容时的解决方案代码如下(结合js)

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!