把微信小程序异步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)除去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}
})

应用场景举例

  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
})
//层层回调,如果逻辑再复杂点,可能就疯了

把微信小程序异步API转为Promise,简化异步编程的更多相关文章

  1. 微信小程序 HTTP API

    微信小程序 HTTP API promise API https://www.npmtrends.com/node-fetch-vs-got-vs-axios-vs-superagent node-f ...

  2. 微信小程序通过api接口将json数据展现到小程序示例

    这篇文章主要介绍了微信小程序通过api接口将json数据展现到小程序示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧实现知乎客户端的一个重要知识前提就是,要知道怎么通过 ...

  3. 图解微信小程序---调用API操作步骤

    图解微信小程序---调用API操作步骤 什么是API API(Application Programming Interface,应用程序编程接口:是一些预先定义的函数,目的是提供应用程序与开发人员基 ...

  4. 微信小程序之 ----API接口

    1. wx.request 接口    可在文件 wxs中操作,连接服务器处理数据    参数    ① url ② data ③ header ④ method ⑤ dataType   回调   ...

  5. 微信小程序-物流api

    原来用的快递100的接口有变动,现有系统上不能使用了.查看快递100提供的api,探寻微信小程序端的使用情况.有几个是比较合适的:1.跳转api(https://www.kuaidi100.com/o ...

  6. 微信小程序请求API接口PHPSESSID变化的解决方式

    微信小程序开发,请求服务器API的方法使用的是微信官方提供的wx.request()方法.在开发中发现,每一个请求都会生成一个独立的PHPSESSID,如下图示: 搜索后得知,这是由于wx.reque ...

  7. 微信小程序通过api接口将json数据展现到小程序上

    实现知乎客户端的一个重要知识前提就是,要知道怎么通过知乎新闻的接口,来把数据展示到微信小程序端上. 那么我们这一就先学习一下,如何将接口获取到的数据展示到微信小程序上. 1.用到的知识点 <1& ...

  8. 微信小程序,时间戳转为日期格式

    //数据转化 function formatNumber(n) { n = n.toString() ] ? n : ' + n } /** * 时间戳转化为年 月 日 时 分 秒 * number: ...

  9. 微信小程序调用api接口

    请求的第三方微信url大概有3种 1)$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&s ...

随机推荐

  1. 201871010110 - 李华 《面向对象程序设计(java)》第二周学习总结

    第一部分:理论知识学习部分 一.简单的Java程序应运程序 1.标识符0标识符由字母.下划线.美元符号和数字组成,且第一个符号不能为数字.   标识符可用作:类名.对象名.变量名.方法名.数组名.文件 ...

  2. Winform 弹框增加确定按钮并点击确定后进行下一步操作

    //审核完毕后调用打印 MessageBoxButtons messButton = MessageBoxButtons.OKCancel; DialogResult dr = MsgBox.Show ...

  3. pytest--常用插件

    前戏 虽然pytest给我们提供了很多的功能,但是有些功能还是没有,而pytest的插件可以满足我们的需求,比如用例失败重跑,统计代码覆盖率等等功能. pytest-sugar pytest-suga ...

  4. centos7 中没有service iptables save指令来保存防火墙规则

    解决方法: systemctl stop firewalld  关闭防火墙yum install iptables-services 安装 iptables 服务systemctl enable ip ...

  5. mac 下使用nasm

    #安装nasm brew install nasm #创建文件 vi hello.asm 写入如下内容 msg: db "hello world!", 0x0a len: equ ...

  6. Centos7之搜索命令locate

    locate命令[1] 1.#locate命令 所搜索的后台数据库 2.updatedb 更新数据库 3.操作 [root@localhost ~]# ls 222  anaconda-ks.cfg ...

  7. 【Gamma】Scrum Meeting 7

    前言 会议定点:大运村公寓 会议时间:2019/6/5 会议目的:明确下阶段目标 一.任务进度 组员 上周任务进度 下阶段任务 大娃 修复后端bug 辅助做好引导录屏 二娃 撰写会议博客 撰写会议博客 ...

  8. flink安装启动(docker)

    参考https://hub.docker.com/_/flink/ 相关端口The Web Client is on port 8081JobManager RPC port 6123TaskMana ...

  9. ASP.NET Core WebApi构建API接口服务实战演练

    一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...

  10. Python【每日一问】30

    问: [基础题]:一个足球队在寻找年龄在10岁到12岁的小女孩(包括10岁和12岁)加入.编写一个程序,询问用户的性别(m表示男性,f表示女性)和年龄,然后显示一条消息指出这个人是否可以加入球队,询问 ...