React/Redux应用使用Async/Await的方法


Posted in Javascript onNovember 16, 2017

Async/Await是尚未正式公布的ES7标准新特性。简而言之,就是让你以同步方法的思维编写异步代码。对于前端,异步任务代码的编写经历了 callback 到现在流行的 Promise ,最终会进化为 Async/Await 。虽然这个特性尚未正式发布,但是利用babel polyfill我们已经可以在应用中使用它了。

现在假设一个简单的React/Redux应用,我将引入 Async/Await 到其代码。

Actions

此例子中有一个创建新文章的 Action ,传统方法是利用 Promise 结合 Redux-thunk 中间件实现。

import axios from 'axios'

export default function createPost (params) { 
  const success = (result) => {
    dispatch({
      type: 'CREATE_POST_SUCCESS',
      payload: result
    })
    return result
  }

  const fail = (err) => {
    dispatch({
      type: 'CREATE_POST_FAIL',
      err
    })
    return err
  }

  return dispatch => {
    return axios.post('http://xxxxx', params)
    .then(success)
    .catch(fail)
  }
}

现在将它改写为 async/await 的实现:

import axios from 'axios'

export default function createPost (params) { 
  const success = (result) => {
    dispatch({
      type: 'CREATE_POST_SUCCESS',
      payload: result
    })
    return result
  }

  const fail = (err) => {
    dispatch({
      type: 'CREATE_POST_FAIL',
      err
    })
    return err
  }

  return async dispatch => {
    try {
      const result = await axios.post('http://xxxxx', params)
      return success(result)
    } catch (err) {
      return fail(err)
    }
  }
}

async和await是成对使用的,特点是使代码看起来和同步代码类似。

Components

同样,在React组件中,也比较一下 Promise 和 Async/Await 的方法异同。

传统地使用 Promise :

import React, { Component } from 'react' 
import { connect } from 'react-redux' 
import { createPost } from '../actions/post'

class PostEditForm extends Component { 
  constructor(props) {
    super(props)
  }

  contributePost = e => {
    e.preventDefault()

    // .... get form values as params

    this.props.createPost(params)
    .then(response => {
      // show success message
    })
    .catch(err => {
      // show error tips
    })
  }

  render () {
    return (
      <form onSubmit={this.contributePost}>
        <input name="title"/>
        <textarea name="content"/>
        <button>Create</button>
      </form>
    )
  }
}

export default connect(null, dispatch => { 
  return {
    createPost: params => dispatch(createPost(params))
  }
})(PostEditForm)

如果使用 Async/Await

import React, { Component } from 'react' 
import { connect } from 'react-redux' 
import { createPost } from '../actions/post'

class PostEditForm extends Component { 
  constructor(props) {
    super(props)
  }

  async contributePost = e => {
    e.preventDefault()

    // .... get form values as params

    try {
      const result = await this.props.createPost(params)
      // show success message
    } catch (err) {
      // show error tips
    }
  }

  render () {
    return (
      <form onSubmit={this.contributePost}>
        <input name="title"/>
        <textarea name="content"/>
        <button>Create</button>
      </form>
    )
  }
}

export default connect(null, dispatch => { 
  return {
    createPost: params => dispatch(createPost(params))
  }
})(PostEditForm)

可以见得,两种模式, Async\Await 的更加直观和简洁,是未来的趋势。但是目前,还需要利用babel的 transform-async-to-module-method 插件来转换其成为浏览器支持的语法,虽然没有性能的提升,但对于代码编写体验要更好。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
csdn 论坛技术区平均给分功能
Nov 07 Javascript
js函数定时器实现定时读取系统实时连接数
Apr 30 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
Aug 30 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
JavaScript记录光标在编辑器中位置的实现方法
Apr 22 Javascript
JS数组去重(4种方法)
Mar 27 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
May 02 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 Javascript
如何编写一个完整的Angular4 FormText 组件
Nov 18 Javascript
Bootstrap实现省市区三级联动(亲测可用)
Jul 26 Javascript
JavaScript实现刮刮乐效果
Nov 01 Javascript
一分钟学会JavaScript中的try-catch
Dec 14 Javascript
详谈DOM简介及节点、属性、查找节点的方法
Nov 16 #Javascript
图片加载完成再执行事件的实例
Nov 16 #Javascript
详解React 在服务端渲染的实现
Nov 16 #Javascript
Angular 5.0 来了! 有这些大变化
Nov 15 #Javascript
详解React Native 采用Fetch方式发送跨域POST请求
Nov 15 #Javascript
bootstrap 通过加减按钮实现输入框组功能
Nov 15 #Javascript
layui框架中layer父子页面交互的方法分析
Nov 15 #Javascript
You might like
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
PHP单链表的实现代码
2016/07/05 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
js静态作用域的功能。
2006/12/25 Javascript
JavaScript 字符串乘法
2009/08/20 Javascript
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
python递归全排列实现方法
2018/08/18 Python
django模板结构优化的方法
2019/02/28 Python
基于python实现雪花算法过程详解
2019/11/16 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
python 自动识别并连接串口的实现
2021/01/19 Python
东南亚排名第一的服务市场:kaodim
2019/03/28 全球购物
田径运动会通讯稿
2014/09/13 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
放假通知
2015/04/14 职场文书
学校党支部承诺书
2015/04/30 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
八年级作文之友谊
2019/12/02 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers