微信小程序使用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 相关文章推荐
jQuery插件PageSlide实现左右侧栏导航菜单
Apr 12 Javascript
jquery性能优化高级技巧
Aug 24 Javascript
基于javascript实现句子翻牌网页版小游戏
Mar 23 Javascript
JS中如何比较两个Json对象是否相等实例代码
Jul 13 Javascript
bootstrap按钮插件(Button)使用方法解析
Jan 13 Javascript
JavaScript实现公历转农历功能示例
Feb 13 Javascript
js实现移动端轮播图效果
Dec 09 Javascript
vue-cli创建的项目,配置多页面的实现方法
Mar 15 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
May 06 Javascript
使用webpack打包后的vue项目如何正确运行(express)
Oct 26 Javascript
基于vue.js实现购物车
Jan 15 Javascript
关于angular浏览器兼容性问题的解决方案
Jul 26 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
第1次亲密接触PHP5(2)
2006/10/09 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
JQUERY操作JSON实例代码
2010/02/09 Javascript
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
在JavaScript中操作时间之setYear()方法的使用
2015/06/12 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
基于JavaScript代码实现微信扫一扫下载APP
2015/12/30 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python 解析html之BeautifulSoup
2009/07/07 Python
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
浅谈Python中的bs4基础
2018/10/21 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
如何用python写个模板引擎
2021/01/14 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
政风行风建设责任书
2014/07/23 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
自荐信大全
2019/03/21 职场文书
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript