微信小程序 引入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 相关文章推荐
一个JS翻页效果
Jul 23 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
Oct 11 Javascript
javascript模拟post提交隐藏地址栏的参数
Sep 03 Javascript
js和jquery中循环的退出和继续学习记录
Sep 06 Javascript
javascript表单验证大全
Aug 12 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
Jan 09 jQuery
实例讲解v-if和v-show的区别
Jan 31 Javascript
微信二次分享报错invalid signature问题及解决方法
Apr 01 Javascript
node.js的http.createServer过程深入解析
Jun 06 Javascript
javascript实现画板功能
Apr 12 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
Oct 24 Javascript
React列表栏及购物车组件使用详解
Jun 28 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 水平的题目
2007/05/30 PHP
PHP 地址栏信息的获取代码
2009/01/07 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
两种方法解决javascript url post 特殊字符转义 + & #
2016/04/13 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
Python正确重载运算符的方法示例详解
2017/08/27 Python
python中的随机函数random的用法示例
2018/01/27 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
python实现浪漫的烟花秀
2019/01/30 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
python3将变量输入的简单实例
2020/08/19 Python
python PIL模块的基本使用
2020/09/29 Python
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
魅力教师事迹材料
2014/01/10 职场文书
美术专业个人自我评价
2014/01/18 职场文书
行政人事岗位职责
2014/03/17 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
对公司的意见和建议
2015/06/04 职场文书
春节随笔
2015/08/15 职场文书
导游词之广西漓江
2019/11/02 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python
python之基数排序的实现
2021/07/26 Python