把微信小程序异步API转为Promise,简化异步编程
把微信小程序异步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)除去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}
})
应用场景举例
- 单次异步调用,参见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
})
//层层回调,如果逻辑再复杂点,可能就疯了
把微信小程序异步API转为Promise,简化异步编程的更多相关文章
- 微信小程序 HTTP API
微信小程序 HTTP API promise API https://www.npmtrends.com/node-fetch-vs-got-vs-axios-vs-superagent node-f ...
- 微信小程序通过api接口将json数据展现到小程序示例
这篇文章主要介绍了微信小程序通过api接口将json数据展现到小程序示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧实现知乎客户端的一个重要知识前提就是,要知道怎么通过 ...
- 图解微信小程序---调用API操作步骤
图解微信小程序---调用API操作步骤 什么是API API(Application Programming Interface,应用程序编程接口:是一些预先定义的函数,目的是提供应用程序与开发人员基 ...
- 微信小程序之 ----API接口
1. wx.request 接口 可在文件 wxs中操作,连接服务器处理数据 参数 ① url ② data ③ header ④ method ⑤ dataType 回调 ...
- 微信小程序-物流api
原来用的快递100的接口有变动,现有系统上不能使用了.查看快递100提供的api,探寻微信小程序端的使用情况.有几个是比较合适的:1.跳转api(https://www.kuaidi100.com/o ...
- 微信小程序请求API接口PHPSESSID变化的解决方式
微信小程序开发,请求服务器API的方法使用的是微信官方提供的wx.request()方法.在开发中发现,每一个请求都会生成一个独立的PHPSESSID,如下图示: 搜索后得知,这是由于wx.reque ...
- 微信小程序通过api接口将json数据展现到小程序上
实现知乎客户端的一个重要知识前提就是,要知道怎么通过知乎新闻的接口,来把数据展示到微信小程序端上. 那么我们这一就先学习一下,如何将接口获取到的数据展示到微信小程序上. 1.用到的知识点 <1& ...
- 微信小程序,时间戳转为日期格式
//数据转化 function formatNumber(n) { n = n.toString() ] ? n : ' + n } /** * 时间戳转化为年 月 日 时 分 秒 * number: ...
- 微信小程序调用api接口
请求的第三方微信url大概有3种 1)$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&s ...
随机推荐
- 201871010110 - 李华 《面向对象程序设计(java)》第二周学习总结
第一部分:理论知识学习部分 一.简单的Java程序应运程序 1.标识符0标识符由字母.下划线.美元符号和数字组成,且第一个符号不能为数字. 标识符可用作:类名.对象名.变量名.方法名.数组名.文件 ...
- Winform 弹框增加确定按钮并点击确定后进行下一步操作
//审核完毕后调用打印 MessageBoxButtons messButton = MessageBoxButtons.OKCancel; DialogResult dr = MsgBox.Show ...
- pytest--常用插件
前戏 虽然pytest给我们提供了很多的功能,但是有些功能还是没有,而pytest的插件可以满足我们的需求,比如用例失败重跑,统计代码覆盖率等等功能. pytest-sugar pytest-suga ...
- centos7 中没有service iptables save指令来保存防火墙规则
解决方法: systemctl stop firewalld 关闭防火墙yum install iptables-services 安装 iptables 服务systemctl enable ip ...
- mac 下使用nasm
#安装nasm brew install nasm #创建文件 vi hello.asm 写入如下内容 msg: db "hello world!", 0x0a len: equ ...
- Centos7之搜索命令locate
locate命令[1] 1.#locate命令 所搜索的后台数据库 2.updatedb 更新数据库 3.操作 [root@localhost ~]# ls 222 anaconda-ks.cfg ...
- 【Gamma】Scrum Meeting 7
前言 会议定点:大运村公寓 会议时间:2019/6/5 会议目的:明确下阶段目标 一.任务进度 组员 上周任务进度 下阶段任务 大娃 修复后端bug 辅助做好引导录屏 二娃 撰写会议博客 撰写会议博客 ...
- flink安装启动(docker)
参考https://hub.docker.com/_/flink/ 相关端口The Web Client is on port 8081JobManager RPC port 6123TaskMana ...
- ASP.NET Core WebApi构建API接口服务实战演练
一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...
- Python【每日一问】30
问: [基础题]:一个足球队在寻找年龄在10岁到12岁的小女孩(包括10岁和12岁)加入.编写一个程序,询问用户的性别(m表示男性,f表示女性)和年龄,然后显示一条消息指出这个人是否可以加入球队,询问 ...