微信小程序使用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中使用正则匹配多条,且获取每条中的分组数据
Nov 30 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 Javascript
javascript中RegExp保留小数点后几位数的方法分享
Aug 13 Javascript
AngularJS内置指令
Feb 04 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
May 25 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
Jul 28 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
Aug 04 Javascript
原生js实现水平方向无缝滚动
Jan 10 Javascript
详解javascript设计模式三:代理模式
Mar 25 Javascript
bootstrap table实现横向合并与纵向合并
Jul 18 Javascript
vue 源码解析之虚拟Dom-render
Aug 26 Javascript
Python版实现微信公众号扫码登陆
May 28 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
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
Javascript事件实例详解
2013/11/06 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
vue实现点击图片放大效果
2017/08/15 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
python开发之for循环操作实例详解
2015/11/12 Python
Django 视图层(view)的使用
2018/11/09 Python
Python离线安装PIL 模块的方法
2019/01/08 Python
python实现电子产品商店
2019/02/26 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
.NET remoting中对象激活的两种方式
2015/06/08 面试题
酒吧总经理岗位职责
2013/12/10 职场文书
4s店机修工岗位职责
2013/12/20 职场文书
实习指导老师评语
2014/04/26 职场文书
信用卡工资证明格式
2014/09/13 职场文书
环卫个人总结
2015/03/03 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
管辖权异议上诉状
2015/05/23 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android