微信小程序使用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 相关文章推荐
JS的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 Javascript
Dom在ajax技术中的作用说明
Oct 25 Javascript
jQuery中:first-child选择器用法实例
Dec 31 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
Mar 31 Javascript
javascript实现图片自动和可控的轮播切换特效
Apr 13 Javascript
简介JavaScript中toTimeString()方法的使用
Jun 12 Javascript
JS文字球状放大效果代码分享
Aug 19 Javascript
javascript实现用户点击数量统计
Dec 25 Javascript
详解通过JSON数据使用VUE.JS
May 26 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
Apr 23 Javascript
element-ui 限制日期选择的方法(datepicker)
May 16 Javascript
使用Angular-CLI构建NPM包的方法
Sep 07 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 获取指定地区的天气实例代码
2017/02/08 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
js 小贴士一星期合集
2010/04/07 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
市场营销专业毕业生自荐信
2013/11/02 职场文书
执行总经理岗位职责
2014/02/03 职场文书
初中学生评语大全
2014/04/24 职场文书
环境科学专业求职信
2014/08/04 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
学校运动会广播稿
2014/10/11 职场文书
工作失职检讨书500字
2014/10/17 职场文书
论文答谢词
2015/01/20 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫