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获取图片原始尺寸
Dec 03 Javascript
详解jQuery中的元素的属性和相关操作
Aug 14 Javascript
Angularjs中UI Router全攻略
Jan 29 Javascript
如何在Linux上安装Node.js
Apr 01 Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 Javascript
jQuery实现的瀑布流加载效果示例
Sep 13 Javascript
使用JavaScript触发过渡效果的方法
Jan 19 Javascript
js获取ip和地区
Mar 10 Javascript
bootstrap select插件封装成Vue2.0组件
Apr 17 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
Sep 16 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
Sep 27 Javascript
详解JavaScript作用域和作用域链
Mar 19 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上传图片、删除图片实现代码
2010/05/12 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
详解Javascript 装载和执行
2014/11/17 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
Python常见文件操作的函数示例代码
2011/11/15 Python
Python的Django框架使用入门指引
2015/04/15 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
创业资金计划书
2014/02/06 职场文书
2014婚礼司仪主持词
2014/03/14 职场文书
医院科室评语
2015/01/04 职场文书
高一军训决心书
2015/02/05 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
小学班主任个人总结
2015/03/03 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB