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 相关文章推荐
js键盘事件的keyCode
Jul 29 Javascript
node.js中的emitter.on方法使用说明
Dec 10 Javascript
jQuery实现自定义右键菜单的树状菜单效果
Sep 02 Javascript
javascript类型系统 Array对象学习笔记
Jan 09 Javascript
javascript的函数劫持浅析
Sep 26 Javascript
JS克隆,属性,数组,对象,函数实例分析
Nov 26 Javascript
js select下拉联动 更具级联性!
Apr 17 Javascript
thinkjs之页面跳转同步异步操作
Feb 05 Javascript
微信小程序中button组件的边框设置的实例详解
Sep 27 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
Nov 07 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
Aug 13 Javascript
解决在vue项目中webpack打包后字体不生效的问题
Sep 01 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
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
JS实现数字格式千分位相互转换方法
2016/08/01 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
老生常谈ES6中的类
2017/07/31 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
python友情链接检查方法
2015/07/08 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
python super函数使用方法详解
2020/02/14 Python
Python线程threading模块用法详解
2020/02/26 Python
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
优秀班干部事迹材料
2014/01/26 职场文书
车辆工程专业求职信
2014/04/28 职场文书
2015年餐厅服务员工作总结
2015/04/23 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
OpenCV 图像梯度的实现方法
2021/07/25 Python