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 相关文章推荐
JavaScript日历实现代码
Sep 12 Javascript
javascript从image转换为base64位编码的String
Jul 29 Javascript
js表头排序实现方法
Jan 16 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
Mar 10 Javascript
jQuery自动添加表单项的方法
Jul 13 Javascript
浅谈jQuery hover(over, out)事件函数
Dec 03 Javascript
AngularJS ionic手势事件的使用总结
Aug 09 Javascript
微信通过页面(H5)直接打开本地app的解决方法
Sep 09 Javascript
js实现数组内数据的上移和下移的实例
Nov 14 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
Feb 02 Javascript
Vue搭建后台系统需要注意的问题
Nov 08 Javascript
Vue组件跨层级获取组件操作
Jul 27 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日期处理函数 整型日期格式
2011/01/12 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
python字典快速保存于读取的方法
2018/03/23 Python
python对日志进行处理的实例代码
2018/10/06 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
pandas分组聚合详解
2020/04/10 Python
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
入党转预备思想汇报
2014/01/07 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
九年级化学教学反思
2014/01/28 职场文书
产品销售计划书
2014/05/04 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
社区服务活动感想
2015/08/11 职场文书
新教师教学工作总结
2015/08/12 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
HTML通过表单实现酒店筛选功能
2021/05/18 HTML / CSS
Python实现抖音热搜定时爬取功能
2022/03/16 Python