把微信小程序异步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 ...
随机推荐
- linux虚拟机获取不到ip的解决方法 --
问题描述: 在win10操作系统上,安装了centos7 虚拟机,安装后,用wifi网络可以获取ip,但是切换到手机热点或有线网络就获取不到ip 解决办法: 按照一般的修改ONBOOT =yes, 然 ...
- Python多线程采集百度相关搜索关键词
百度相关搜索关键词抓取,读取txt关键词,导出txt关键词 #百度相关搜索关键词抓取,读取txt关键词,导出txt关键词 # -*- coding=utf-8 -*- import request ...
- CentOS7 只下载安装包不安装
参考文档 yum安装本地rpm软件方案详解 https://www.jb51.net/article/132305.htm createrepo CentOS-Media.repo 本地软件源 --d ...
- react使用ant design pro时的滑动图片组件
react的滑动图片验证,是基于https://segmentfault.com/a/1190000018309458?utm_source=tag-newest做的修改,改动的主要有以下几点: 1. ...
- DCI学习链接及文章
https://www.jianshu.com/u/c1b1137d5886 李永顺 https://www.jianshu.com/users/7386692d5489/timeline 袁英杰 小 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块(Air202,SIM800)AT指令TCP透传方式,MQTT通信控制升级
实现功能概要 这节和上一节的功能一样(只不过上节是利用Wi-Fi模块,这节是利用GPRS模块) 用户程序里面加入MQTT通信,执行用户程序的时候, 通过接收MQTT的升级命令实现升级. 凡是可以实现M ...
- Problem B. 即时战略 ———2019.10.12
题目: 代码~:感谢土蛋 #include <iostream> #include <cstring> #include <cmath> #include &l ...
- nRF51822 看门狗和OTA (无线升级功能)的尴尬笔记
很久没有记笔记了.今天要记点东西,不然以后又忘记了. 随着时代的发展,现在的SDK已经是13.0了.蓝牙5.0也就来了.废话就少说了,记笔记吧. 两年前搞过nRF51822 的无线升级功能,那时候用的 ...
- 解析node-cors模块
(function () { 'use strict'; var assign = require('object-assign'); var vary = require('vary'); var ...
- Django 分析(一)Requst、Middleware 和 Response 数据流
0. 前言 通过 Django 编写 HTTP 接口时,我们需要指定 URL.Model 和 Views 函数(或者指定 RESTBaseView 对象解析参数和编写逻辑) 编写逻辑时的基本思路就是解 ...