小程序接口的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 相关文章推荐
javascript URL锚点取值方法
Feb 25 Javascript
对象特征检测法判断浏览器对javascript对象的支持
Jul 25 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
Jun 21 Javascript
jQueryUI如何自定义组件实现代码
Nov 14 Javascript
jquery animate图片模向滑动示例代码
Jan 26 Javascript
JQuery分屏指示器图片轮换效果实例
May 21 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
Jun 28 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
Sep 24 Javascript
node.js中axios使用心得总结
Nov 29 Javascript
浅谈Vue响应式(数组变异方法)
May 07 Javascript
JS匿名函数内部this指向问题详析
May 10 Javascript
如何在项目中使用log4.js的方法步骤
Jul 16 Javascript
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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
PHP中捕获超时事件的方法实例
2015/02/12 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
布同自制Python函数帮助查询小工具
2011/03/13 Python
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
大学生校园创业计划书
2014/02/08 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
教师个人自我评价范文
2014/04/13 职场文书
预备党员综合考察材料
2014/05/31 职场文书
工作失职检讨书500字
2014/10/17 职场文书
信访维稳工作汇报
2014/10/27 职场文书
检察院起诉书
2015/05/20 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技