微信小程序使用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 相关文章推荐
两个SUBMIT按钮,如何区分处理
Aug 22 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
Jun 04 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
Sep 09 Javascript
JQuery遍历json数组的3种方法
Nov 08 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
Apr 03 Javascript
javascript 内置对象及常见API详细介绍
Nov 01 Javascript
js 图片转base64的方式(两种)
Apr 24 Javascript
基于Vue的延迟加载插件vue-view-lazy
May 21 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
Aug 25 Javascript
ios中视频的最后一桢问题解决
May 14 Javascript
layui实现二维码弹窗、并下载到本地的方法
Sep 25 Javascript
JavaScript实现图片伪异步上传过程解析
Apr 10 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与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
Javascript的&&和||的另类用法
2014/07/23 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
AngularJS压缩JS技巧分析
2016/11/08 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
python3实现微型的web服务器
2019/09/03 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
大学生实习期自我评价范文
2013/10/03 职场文书
艺术应用与设计专业个人的自我评价
2013/11/19 职场文书
党委领导班子整改方案
2014/09/30 职场文书
党员民主评议自我评价
2014/10/20 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
投诉信范文
2015/07/02 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android