微信小程序使用Promise简化回调


Posted in Javascript onFebruary 06, 2018

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

了解什么是 Promise 对象

在项目中,会出现各种异步操作,如果一个异步操作的回调里还有异步操作,就会出现回调金字塔。

比如下面这种

// 模拟获取code,然后将code传给后台,成功后获取userinfo,再将userinfo传给后台
// 登录
wx.login({
  success: res => {
    let code = res.code
    // 请求
    imitationPost({
      url: '/test/loginWithCode',
      data: {
        code
      },
      success: data => {
        // 获取userInfo
        wx.getUserInfo({
          success: res => {
            let userInfo = res.userInfo
            // 请求
            imitationPost({
              url: '/test/saveUserInfo',
              data: {
                userInfo
              },
              success: data => {
                console.log(data)
              },
              fail: res => {
                console.log(res)
              }
            })
          },
          fail: res => {
            console.log(res)
          }
        })
      },
      fail: res => {
        console.log(res)
      }
    })
  },
  fail: res => {
    console.log(res)
  }
})

下面分析如何用Promise来进行简化代码

因为微信小程序异步api都是success和fail的形式,所有有人封装了这样一个方法:

promisify.js

module.exports = (api) => {
  return (options, ...params) => {
    return new Promise((resolve, reject) => {
      api(Object.assign({}, options, { success: resolve, fail: reject }), ...params);
    });
  }
}

先看最简单的:

// 获取系统信息
wx.getSystemInfo({
  success: res => {
    // success
    console.log(res)
  },
  fail: res => {

  }
})

使用上面的promisify.js简化后:

const promisify = require('./promisify')
const getSystemInfo = promisify(wx.getSystemInfo)

getSystemInfo().then(res=>{
  // success
  console.log(res)
}).catch(res=>{

})

微信小程序使用Promise简化回调

getSystemInfo

可以看到简化后的回调里少了一个缩进,并且回调函数从9行减少到了6行。

回调金字塔的简化效果

那么再来看看最开始的那个回调金字塔

const promisify = require('./promisify')
const login = promisify(wx.login)
const getSystemInfo = promisify(wx.getSystemInfo)

// 登录
login().then(res => {
  let code = res.code
  // 请求
  pImitationPost({
    url: '/test/loginWithCode',
    data: {
      code
    },
  }).then(data => {
    // 获取userInfo
    getUserInfo().then(res => {
      let userInfo = res.userInfo
      // 请求
      pImitationPost({
        url: '/test/saveUserInfo',
        data: {
          userInfo
        },
      }).then(data => {
        console.log(data)
      }).catch(res => {
        console.log(res)
      })
    }).catch(res => {
      console.log(res)
    })
  }).catch(res => {
    console.log(res)
  })
}).catch(res => {
  console.log(res)
})

微信小程序使用Promise简化回调

简化回调

可以看到简化效果非常明显。

同样适用于网页或者nodejs等中。

参考

Promise 对象

源代码

tomfriwel/MyWechatAppDemo 的promisePage页面

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
动态修改DOM 里面的 id 属性的弊端分析
Sep 03 Javascript
jQuery函数的等价原生函数代码示例
May 27 Javascript
js中如何把字符串转化为对象、数组示例代码
Jul 17 Javascript
jQuery过滤选择器:not()方法使用介绍
Apr 20 Javascript
jquery获取一个元素下面相同子元素的个数代码
Jul 31 Javascript
微信支付如何实现内置浏览器的H5页面支付
Sep 25 Javascript
基于javascript实现图片滑动效果
May 07 Javascript
原生js实现回复评论功能
Jan 18 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
May 30 Javascript
VUE中的无限循环代码解析
Sep 22 Javascript
seajs模块压缩问题与解决方法实例分析
Oct 10 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
Aug 24 Javascript
JS设计模式之命令模式概念与用法分析
Feb 06 #Javascript
使用selenium抓取淘宝的商品信息实例
Feb 06 #Javascript
vue一个页面实现音乐播放器的示例
Feb 06 #Javascript
使用百度地图实现地图网格的示例
Feb 06 #Javascript
js中的闭包学习心得
Feb 06 #Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
Feb 06 #Javascript
Vue仿今日头条实例详解
Feb 06 #Javascript
You might like
Discuz! Passport 通行证整合
2008/03/27 PHP
php读取msn上的用户信息类
2008/12/05 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
Zend Guard使用指南及问题处理
2015/01/07 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
javascript 自定义回调函数示例代码
2014/09/26 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
python opencv读mp4视频的实例
2018/12/07 Python
详解Python 切片语法
2019/06/10 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
keras打印loss对权重的导数方式
2020/06/10 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
数据库专业英语
2012/11/30 面试题
生产部统计员岗位职责
2014/01/05 职场文书
幼儿园端午节活动方案
2014/08/25 职场文书
2015元旦标语横幅
2014/12/09 职场文书
2015年基层党建工作汇报材料
2015/06/25 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang
Python3 如何开启自带http服务
2021/05/18 Python
浅谈MySQL之select优化方案
2021/08/07 MySQL
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技
基于Python实现对比Exce的工具
2022/04/07 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python