微信小程序使用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 相关文章推荐
JavaScript 调试器简介
Feb 21 Javascript
javascript dom代码应用 简单的相册[firefox only]
Jun 12 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
Jun 09 Javascript
使用AngularJS实现表单向导的方法
Jun 19 Javascript
理解Javascript的call、apply
Dec 16 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
Mar 03 Javascript
JS之获取样式的简单实现方法(推荐)
Sep 13 Javascript
Vue2.0权限树组件实现代码
Aug 29 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
vue项目引入Iconfont图标库的教程图解
Oct 24 Javascript
JavaScript动态检测密码强度原理及实现方法详解
Jun 11 Javascript
Node.js中出现未捕获异常的处理方法
Jun 29 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
WHOIS类的修改版
2006/10/09 PHP
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
php批量修改表结构实例
2017/05/24 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
教你如何在Node.js中使用jQuery
2016/08/28 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
微信小程序实现聊天室
2020/08/21 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
Python在线运行代码助手
2016/07/15 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
HTML5实现表单自动验证功能实例代码
2017/01/11 HTML / CSS
体育学院毕业生自荐信
2013/11/03 职场文书
2014年采购部工作总结
2014/11/20 职场文书
雷锋观后感
2015/06/10 职场文书
庆七一主持词
2015/06/29 职场文书