资讯专栏INFORMATION COLUMN

把微信小程序异步API转为Promise,简化异步编程,告别层层回调

antz / 1186人阅读

摘要:微信官方没有给出来处理异步操作,而官方异步的又非常多,这使得多异步编程会层层回调,代码一复杂,回调起来就想砸电脑。是一个转换微信小程序异步为的一个工具库优点避免小程序异步编程多次回调带来的过多回调导致逻辑不清晰,篇幅过长等问题。

把微信小程序异步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的一个工具库

优点:

避免小程序异步编程多次回调带来的过多回调导致逻辑不清晰,篇幅过长等问题。

借助于Promise异步编程特点,支持链式操作,像同步一样写异步。

转化后得API几乎和微信官方API一样。

使用方法:

安装

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

git clone https://github.com/tornoda/to-promise

或直接下载放入项目目录下如:/module

在需要用到的地方引入

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

绑定微信全局对象(wx)到函数,以便可以取到微信得API

const toPromiseWx = toPromise(wx)

开始转化你需要得异步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)除去successfail后的对象。例如:

官方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}
})

应用场景举例

单次异步调用,参见API最后

多次异步操作调用,且每下一次调用都会用到前一次返回的结果。

如:获得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.ucloud.cn/yun/108177.html

相关文章

  • JavaScript Promise 告别异步乱嵌套

    摘要:回调函数少了还好,一旦多了起来而且必须讲究执行顺序的话,回调函数开始嵌套,那代码的恶心程度是相当不符合常人的线性思维的。 这是我的原创文章,原文地址:http://lpgray.me/article/43/ 什么是Promise? 在说Promise之前,不得不说一下JavaScript的嵌套的回调函数 在JavaScript语言中,无论是写浏览器端的各种事件处理回调、ajax回调,还...

    Ryan_Li 评论0 收藏0
  • 信小程序:使用Promise简化回调

    摘要:了解什么是对象在项目中,会出现各种异步操作,如果一个异步操作的回调里还有异步操作,就会出现回调金字塔。回调金字塔的简化效果那么再来看看最开始的那个回调金字塔登录请求获取请求可以看到简化效果非常明显。同样适用于网页或者等中。 showImg(https://segmentfault.com/img/remote/1460000013228704); 了解什么是 Promise 对象 在项...

    JeOam 评论0 收藏0
  • 终极蛇皮上帝视角之微信小程序告别 setData

    摘要:而小程序官方的是在中调用方法来改变数据,从而改变界面。为了写测试让咱们来重构一把,利用学习过的函数式编程中的高阶函数把依赖注入。也就是说当中的某个数据更新的时候,我们并不知道它会影响哪个中的属性,特别的还有依赖于的情况。 众所周知 Vue 是借助 ES5 的 Object.defineProperty 方法设置 getter、setter 达到数据驱动界面,当然其中还有模板编译等等其他...

    wuyumin 评论0 收藏0
  • JavaScript Promise 告别异步乱嵌套

    摘要:回调函数少了还好,一旦多了起来而且必须讲究执行顺序的话,回调函数开始嵌套,那代码的恶心程度是相当不符合常人的线性思维的。 什么是Promise? 在说Promise之前, 不得不说一下,JavaScript的嵌套的回调函数 在JavaScript语言中, 无论是写浏览器端的各种事件回调、ajax回调,还是写Node.js上的业务逻辑,不得不面对的问题就是各种回调函数。回调函数少了还好,...

    Mr_houzi 评论0 收藏0
  • JavaScript 异步

    摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。写一个符合规范并可配合使用的写一个符合规范并可配合使用的理解的工作原理采用回调函数来处理异步编程。 JavaScript怎么使用循环代替(异步)递归 问题描述 在开发过程中,遇到一个需求:在系统初始化时通过http获取一个第三方服务器端的列表,第三方服务器提供了一个接口,可通过...

    tuniutech 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<