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 showModalDialog 多层模态窗口实现页面提交及刷新的代码
Nov 28 Javascript
CutePsWheel javascript libary 控制输入文本框为可使用滚轮控制的js库
Feb 07 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
Jul 11 Javascript
jquery通过visible来判断标签是否显示或隐藏
May 08 Javascript
node.js中的fs.utimes方法使用说明
Dec 15 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
Feb 16 Javascript
JavaScript实现的伸展收缩型菜单代码
Oct 14 Javascript
详解Vue方法与事件
Mar 09 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
Aug 28 Javascript
Angular中点击li标签实现更改颜色的核心代码
Dec 08 Javascript
vue.js做一个简单的编辑菜谱功能
May 08 Javascript
Vue组件之极简的地址选择器的实现
May 31 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下安装配置fckeditor编辑器的方法
2011/03/02 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
PHP 实现缩略图
2021/03/09 PHP
图片自动更新(说明)
2006/10/02 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
2014/06/20 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
js匿名函数使用&amp;传参(实例)
2017/09/08 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
使用webpack和rollup打包组件库的方法
2021/02/25 Javascript
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
Python socket编程实例详解
2015/05/27 Python
Python中return self的用法详解
2018/07/27 Python
Python简单实现区域生长方式
2020/01/16 Python
python随机模块random使用方法详解
2020/02/14 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
思想品德自我评价
2014/02/04 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
机关领导干部作风整顿整改措施
2014/09/19 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
职位证明模板
2015/06/23 职场文书
SQLServer之常用函数总结详解
2021/08/30 SQL Server