微信小程序使用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 异常处理使用总结
Jun 21 Javascript
HTML中的setCapture和releaseCapture使用介绍
Mar 21 Javascript
浅谈jQuery.easyui的datebox格式化时间
Jun 25 Javascript
JavaScript常用数组算法小结
Feb 13 Javascript
js仿百度切换皮肤功能(html+css)
Jul 10 Javascript
Javascript实现汉字和拼音互转的终极方案
Oct 19 Javascript
jQuery简单自定义图片轮播插件及用法示例
Nov 21 Javascript
JavaScript的继承实现小结
May 07 Javascript
垃圾回收器的相关知识点总结
May 13 Javascript
layer父页获取弹出层输入框里面的值方法
Sep 02 Javascript
vue-socket.io接收不到数据问题的解决方法
May 13 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
Nov 05 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实现框架(二)
2006/10/09 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
一次因composer错误使用引发的问题与解决
2019/03/06 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
EXT中xtype的含义分析
2010/01/07 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&闭包&减缓全局空间污染
2010/11/16 Javascript
你必须知道的Javascript知识点之"字面量和对应类型"说明介绍
2013/04/23 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
细说Vue组件的服务器端渲染的过程
2019/05/30 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
Python对象体系深入分析
2014/10/28 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
python学生信息管理系统(完整版)
2020/04/05 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
管理失职检讨书范文
2015/05/05 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
html5表单的required属性使用
2021/07/07 HTML / CSS
Java完整实现记事本代码
2022/06/16 Java/Android