小程序接口的promise化的实现方法


Posted in Javascript onDecember 11, 2019

最近在写微信小程序,为了能用上 async/await 方法,需要把微信提供的异步操作包装成 Promise 对象,为此写了一个简单的 promise(fie) 函数:

/**
 * @function promise - 将 wx 接口 promise 化
 * 
 * @param { String|Function } wxApi - 需要转换的接口/接口名
 * @param { Object|Any } [originParam = {}] - 原接口要求的参数对象
 * @param { Object|Any } [extra] - 接口要求的其他参数
 */
function promise(wxApi, originParam = {}, extra){
 const api = wxApi instanceof Function?
  wxApi:
  wx[wxApi];

 return new Promise((done, fail) =>
  api(Object.assign(
   originParam,
   {
    success: done,
    failed: fail
   }
  ),
  extra)
 );
}

正当我沾沾自喜、兴致冲冲地调用拍照接口测试时,控制台扔给我一个 “this._invokeMethod is not a Function” 的错误。显而易见,由于 wxApi 被当做参数传递,执行时的 this 与预期不一致,因此需要显式指定上下文,遂把函数再改改:

/**
 * @function promise - 将 wx 接口 promise 化
 * 
 * @param { String|Function } wxApi - 需要转换的接口/接口名
 * @param { Object|Any } [originParam = {}] - 原接口要求的参数对象
 * @param { Object|Any } [context = wx] - 执行上下文
 * @param { Object|Any } [extra] - 接口要求的其他参数
 */
function promise(wxApi, originParam = {}, context = wx, extra){
 const api = wxApi instanceof Function?
  wxApi:
  context[wxApi];

 return new Promise((done, fail) =>
  api.call(context, Object.assign(
   originParam,
   {
    success: done,
    failed: fail
   }
  ),
  extra)
 );
}

由于大部分接口都是 wx 的方法,因此这个 promise 方法在大多数情况下还是比较省事的。不过拍照接口是 cameraContext 的方法,所以传递的是 createCameraContext 方法的返回值:

/**
 * @function takePhoto - promise风格的拍照接口
 * 
 * @param { Object|Any } [options = {}] - 相机配置
 * 
 * @return {Promise}
 */
export function takePhoto(options = {}){
  const tempOptions = {
    quality: 'high',
    ...options
  }

 const cameraContext = createCameraContext();

 return promise(cameraContext.takePhoto, tempOptions, cameraContext);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
Jan 12 Javascript
HTML中的setCapture和releaseCapture使用介绍
Mar 21 Javascript
node.js WEB开发中图片验证码的实现方法
Jun 03 Javascript
js动态修改表格行colspan列跨度的方法
Mar 30 Javascript
JS实现仿QQ聊天窗口抖动特效
May 10 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
May 25 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
Oct 10 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
Sep 16 Javascript
JavaScript模板引擎原理与用法详解
Dec 24 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
Mar 27 Javascript
Vue3.0的优化总结
Oct 16 Javascript
浅谈Vue的computed计算属性
Mar 21 Vue.js
js中Function引用类型常见有用的方法和属性详解
Dec 11 #Javascript
jQuery实现验证用户登录
Dec 10 #jQuery
这样回答继承可能面试官更满意
Dec 10 #Javascript
jquery实现弹窗(系统提示框)效果
Dec 10 #jQuery
微信小程序 this.triggerEvent()的具体使用
Dec 10 #Javascript
jQuery实现消息弹出框效果
Dec 10 #jQuery
jQuery实现弹出层效果
Dec 10 #jQuery
You might like
php 结果集的分页实现代码
2009/03/10 PHP
PHP计数器的实现代码
2013/06/08 PHP
php实现Session存储到Redis
2015/11/11 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
jquery实现带单选按钮的表格行选中时高亮显示
2013/08/01 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
python记录程序运行时间的三种方法
2017/07/14 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
Python对象中__del__方法起作用的条件详解
2018/11/01 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
python正则表达式实例代码
2020/03/03 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
2020/06/02 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
教室布置标语
2014/06/26 职场文书
超市创业计划书
2014/09/15 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
Golang数据类型和相互转换
2022/04/12 Golang
element tree树形组件回显数据问题解决
2022/08/14 Javascript