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脚本性能优化注意事项
Nov 18 Javascript
jquery下利用jsonp跨域访问实现方法
Jul 29 Javascript
Javascript实现视频轮播在pc端与移动端均可
Sep 29 Javascript
JavaScript中的异常捕捉介绍
Dec 31 Javascript
js获取元素外链样式的方法
Jan 27 Javascript
Angular2内置指令NgFor和NgIf详解
Aug 03 Javascript
Bootstrap CSS组件之导航条(navbar)
Dec 17 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
Mar 29 Javascript
jQuery中 DOM节点操作方法大全
Oct 12 jQuery
js JSON.stringify()基础详解
Jun 19 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
Mar 10 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
Oct 24 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常用字符串比较函数实例汇总
2014/11/24 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
php扩展开发入门demo示例
2019/09/23 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
javascript读写json示例
2014/04/11 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python查看多台服务器进程的脚本分享
2014/06/11 Python
pandas series序列转化为星期几的实例
2018/04/11 Python
python实现集中式的病毒扫描功能详解
2019/07/09 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
50个强大璀璨的CSS3/JS技术运用实例
2010/02/27 HTML / CSS
物流管理毕业生自荐信
2013/10/24 职场文书
全陪导游欢迎词
2014/01/17 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
销售会议开幕词
2015/01/28 职场文书
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS