微信小程序 引入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中暂停功能的实现代码
Mar 04 Javascript
javascript Select标记中options操作方法集合
Oct 22 Javascript
JavaScript 封装Ajax传递的数据代码
Jun 05 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
Oct 24 Javascript
如何使用jquery实现文字上下滚动效果
Oct 12 Javascript
Vue声明式渲染详解
May 17 Javascript
js实现随机数字字母验证码
Jun 19 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 Javascript
微信小程序控制台提示warning:Now you can provide attr "wx:key" for a "wx:for" to improve performance解决方法
Feb 21 Javascript
JS利用prototype给类添加方法操作详解
Jun 21 Javascript
Vue根据条件添加click事件的方式
Nov 09 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
Dec 20 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
Php Mssql操作简单封装支持存储过程
2009/12/11 PHP
PHP 文件系统详解
2012/09/13 PHP
PHP常用的三种设计模式
2017/02/17 PHP
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
Jquery 扩展方法
2010/05/06 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
javascript常用函数(1)
2015/11/04 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
python如何发布自已pip项目的方法步骤
2018/10/09 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
Python列表的切片实例讲解
2019/08/20 Python
python实现简单井字棋游戏
2020/03/04 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
现金会计岗位职责
2013/12/05 职场文书
酒店实习个人鉴定
2013/12/07 职场文书
小学生优秀评语大全
2014/04/22 职场文书
火灾现场处置方案
2014/05/28 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
关于环保的活动方案
2014/08/25 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python