以小程序为例,学习如何将异步回调接口 Promise 化
栏目: JavaScript · 发布时间: 5年前
内容简介:ES6 标准的但是至今仍有很多库没有实现为了不向恶势力妥协,写出风格统一的代码,我们有必要了解何为 Promise。
ES6 标准的 Promise
解决了 Javascript 代码中比较常见的回调地狱问题,搭配 async
/ await
可以用同步的方式写异步逻辑,大大提高了开发效率。
但是至今仍有很多库没有实现 Promise
化的接口,其中就包括微信小程序的 api。
为了不向恶势力妥协,写出风格统一的代码,我们有必要了解何为 Promise。
本文假定读者有一定 JavaScript 基础,同时了解 Promise
的基本用法。
回调接口
异步回调接口指的是通过传递函数来处理异步方法调用,一般有两种方式。
-
小程序方式
分别传递成功和失败的回调以处理两种不同情况
wx.showToast({ title: 'Hello, world', success: () => console.log('success'), fail: () => console.log('failure'), }) 复制代码
-
MongoDB 方式
传递一个以 error 为首参数的回调用以鉴别是否调用成功
db.find({ name: 'Idan Loo' }, (err, data) => { if (err) { // err 是调用失败的原因 console.log(err) return } // data 就是异步传递回来的参数 console.log(data) }) 复制代码
两种方式各有千秋,这里仅讨论微信方式,MongoDB 方式的接口 Promise
化相信各位可以举一反三。
Promise 化
简单实现
以 showToast
为例
const showToast = option => new Promise((resolve, reject) => wx.showToast({...option, success: resolve, fail: reject, }) ) showToast({ title: 'Hello, Promise' }) .then(() => console.log('success')) .catch(() => console.log('failure')) 复制代码
你已经知道了如何 Promise
化小程序的接口,现在你只需要重复上面的代码,将所有你需要用到的接口改为 Promise
的即可。
高级一点的实现
复制粘贴一把梭虽然快,但是作为一名程序员,自然应该追求更简洁的实现。
通过观察,小程序所有的异步接口都采用了相同的形式,并且都位于 wx
对象中,故我们可以抽象出通用的 promisify
方法用以 Promise
化小程序的接口
const promisify = name => option => new Promise((resolve, reject) => wx[name]({...option, success: resolve, fail: reject, }) ) const showToast = promisify('showToast') const request = promisify('request') 复制代码
现在只需一行代码,就可以 Promise
化小程序的接口,赶紧把之前写的丑陋的回调代码改过来吧!
更高级的实现
如果你跟我一样,代码洁癖到上述代码都接受不了的话,那恭喜你,通过Proxy 可以更好的实现我们的目标。
const pro = new Proxy(wx, { get(target, prop) { return promisify(prop) } }) pro.showToast({ title: 'Hello, world' }).then(...) pro.request({ url: 'https://github.com' }).then(...) 复制代码
在 promisify
方法的基础上,给 wx
对象加了个代理,现在你可以像使用 wx
对象一样使用 pro
,并且所有的异步方法都变成了 Promise
形式的!
无需实现
最好的实现就是交给别人实现,正好我已经把前文中的代码打包上传, minapp-promise ,不足 1k,开箱即用。
能看到这里着实不易,希望你们能给我点个赞,顺便在 GitHub 给我个星星就更好了。
手机码字,如有错漏,万望斧正。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 解决异步的方案---回调函数
- javascript异步中的回调
- Netty推荐addListener回调异步执行
- JavaScript异步之从回调函数到Promise
- JS 异步发展流程(回调函数=>Async/await)
- netty的Future异步回调难理解?手写个带回调异步框架就懂了
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据挖掘导论
(美)Pang-Ning Tan、Michael Steinbach、Vipin Kumar / 机械工业出版社 / 2010-9 / 59.00元
本书全面介绍了数据挖掘的理论和方法,着重介绍如何用数据挖掘知识解决各种实际问题,涉及学科领域众多,适用面广。 书中涵盖5个主题:数据、分类、关联分析、聚类和异常检测。除异常检测外,每个主题都包含两章:前面一章讲述基本概念、代表性算法和评估技术,后面一章较深入地讨论高级概念和算法。目的是使读者在透彻地理解数据挖掘基础的同时,还能了解更多重要的高级主题。 本书特色 ·包含大量的图表、......一起来看看 《数据挖掘导论》 这本书的介绍吧!