微信小程序 引入es6 promise


Posted in Javascript onApril 12, 2017

微信小程序开发两个月了.大家的项目都在不断迭代.已经不是小程序.这时候就会遇到多层回调嵌套的问题.有些目不忍视了.迫不得已引入es6-promise.在微信小程序内测的时候promise不需要手动引入,后来被微信移除了.看看效果.

 微信小程序 引入es6 promise

promise详细的介绍我就不说了.有很多大神写过.

看看目录,引入es6-promise就可以用了.

 微信小程序 引入es6 promise

目录

1.网络请求 wxRequest.js

这里只写了get和post.

我经常会在网络请求的时候用微信原生showToast(),所以最后加了finally,方便hideToast()

var Promise = require('../plugins/es6-promise.js')

function wxPromisify(fn) {
 return function (obj = {}) {
 return new Promise((resolve, reject) => {
 obj.success = function (res) {
 //成功
 resolve(res)
 }
 obj.fail = function (res) {
 //失败
 reject(res)
 }
 fn(obj)
 })
 }
}
//无论promise对象最后状态如何都会执行
Promise.prototype.finally = function (callback) {
 let P = this.constructor;
 return this.then(
 value => P.resolve(callback()).then(() => value),
 reason => P.resolve(callback()).then(() => { throw reason })
 );
};
/**
 * 微信请求get方法
 * url
 * data 以对象的格式传入
 */
function getRequest(url, data) {
 var getRequest = wxPromisify(wx.request)
 return getRequest({
 url: url,
 method: 'GET',
 data: data,
 header: {
 'Content-Type': 'application/json'
 }
 })
}

/**
 * 微信请求post方法封装
 * url
 * data 以对象的格式传入
 */
function postRequest(url, data) {
 var postRequest = wxPromisify(wx.request)
 return postRequest({
 url: url,
 method: 'POST',
 data: data,
 header: {
 "content-type": "application/x-www-form-urlencoded"
 },
 })
}

module.exports = {
 postRequest: postRequest,
 getRequest: getRequest
}

2.微信其他API wxApi.js

var Promise = require('../plugins/es6-promise.js')

function wxPromisify(fn) {
 return function (obj = {}) {
 return new Promise((resolve, reject) => {
 obj.success = function (res) {
 //成功
 resolve(res)
 }
 obj.fail = function (res) {
 //失败
 reject(res)
 }
 fn(obj)
 })
 }
}
//无论promise对象最后状态如何都会执行
Promise.prototype.finally = function (callback) {
 let P = this.constructor;
 return this.then(
 value => P.resolve(callback()).then(() => value),
 reason => P.resolve(callback()).then(() => { throw reason })
 );
};
/**
 * 微信用户登录,获取code
 */
function wxLogin() {
 return wxPromisify(wx.login)
}
/**
 * 获取微信用户信息
 * 注意:须在登录之后调用
 */
function wxGetUserInfo() {
 return wxPromisify(wx.getUserInfo)
}
/**
 * 获取系统信息
 */
function wxGetSystemInfo() {
 return wxPromisify(wx.getSystemInfo)
}
module.exports = {
 wxPromisify: wxPromisify,
 wxLogin: wxLogin,
 wxGetUserInfo: wxGetUserInfo,
 wxGetSystemInfo: wxGetSystemInfo
}

3.用法

promise应用场景很多,下面是promise最基本的用法,在then()中returnpromise对象.

这样有效解决了回调嵌套的问题.让代码看起来更优雅.可读性更高.

var util = require('../../utils/util')
var wxApi = require('../../utils/wxApi')
var wxRequest = require('../../utils/wxRequest')
import config from '../../utils/config'
//获取应用实例
var app = getApp()
Page({
 data: {
 userInfo: {}
 },
 onLoad: function () {
 var that = this;
 wx.showToast({
 title: '加载中',
 icon: 'loading',
 duration: 10000
 })
 //1.获取code
 var wxLogin = wxApi.wxLogin()
 wxLogin().then(res => {
 console.log('1.成功了')
 console.log(res.code)
 var url = config.getOpenidUrl;
 var params = {
 appid: "wxed7******2d465",
 secret: "e9c5e4c******09ecc5ebd811",
 js_code: res.code,
 grant_type: "authorization_code"
 }
 //2.获取openid
 return wxRequest.getRequest(url, params)
 }).
 then(res => {
 console.log('2.成功了')
 console.log(res)
 var url = app.globalData.ip + config.searchDgUrl
 var data = util.json2Form({ phoneNumber: '15971908021' })
 //3.获取绑定手机号码
 return wxRequest.postRequest(url, data)
 }).
 then(res => {
 console.log('3.成功了')
 console.log(res)
 //4.获取系统信息
 var wxGetSystemInfo = wxApi.wxGetSystemInfo()
 return wxGetSystemInfo()
 }).
 then(res => {
 console.log('4.成功了')
 console.log(res)
 //5.获取用户信息
 var wxGetUserInfo = wxApi.wxGetUserInfo()
 return wxGetUserInfo()
 }).
 then(res => {
 console.log('5.成功了')
 console.log(res.userInfo)
 that.setData({
  userInfo: res.userInfo
 })
 })
 .finally(function (res) {
 console.log('finally~')
 wx.hideToast()
 })
 }
})

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript Scoping and Hoisting 翻译
Jul 03 Javascript
关于js new Date() 出现NaN 的分析
Oct 23 Javascript
HTML Color Picker(js拾色器效果)
Aug 27 Javascript
我的Node.js学习之路(一)
Jul 06 Javascript
javascript中call,apply,bind的用法对比分析
Feb 12 Javascript
再谈Javascript中的异步以及如何异步
Aug 19 Javascript
Vue实现双向数据绑定
May 03 Javascript
深入浅析Node.js单线程模型
Jul 10 Javascript
JavaScript高级函数应用之分时函数实例分析
Aug 03 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 Javascript
BootStrap前端框架使用方法详解
Feb 26 Javascript
如何构建 vue-ssr 项目的方法步骤
Aug 04 Javascript
JavaScript队列的应用实例详解【经典数据结构】
Apr 12 #Javascript
Vue 实用分页paging实例代码
Apr 12 #Javascript
jquery 校验中国身份证号码实例详解
Apr 11 #jQuery
基于JavaScript定位当前的地理位置
Apr 11 #Javascript
js模拟支付宝密码输入框
Apr 11 #Javascript
基于jQuery实现瀑布流页面
Apr 11 #jQuery
详解angular用$sce服务来过滤HTML标签
Apr 11 #Javascript
You might like
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
python将unicode和str互相转化的实现
2020/05/11 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
荟萃全球保健品:维他购
2018/05/09 全球购物
餐饮业创业计划书范文
2014/01/06 职场文书
小学校园活动策划
2014/01/30 职场文书
高中军训感想300字
2014/03/04 职场文书
赔偿协议书范本
2014/04/15 职场文书
护士感人事迹
2014/05/01 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
经理助理岗位职责
2015/02/02 职场文书
2015年市场部工作总结
2015/04/30 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
小学数学国培研修日志
2015/11/13 职场文书
详解nginx进程锁的实现
2021/06/14 Servers