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 相关文章推荐
window.js 主要包含了页面的一些操作
Dec 23 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
Nov 05 Javascript
JS数组的赋值介绍
Mar 10 Javascript
JS控制按钮10秒钟后可用的方法
Dec 22 Javascript
jQuery Ajax实现跨域请求
Jan 21 Javascript
js 概率计算(简单版)
Sep 12 Javascript
js装饰设计模式学习心得
Feb 17 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
Apr 10 Javascript
Vue2 监听属性改变watch的实例代码
Aug 27 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
Apr 11 Javascript
在vue中高德地图引入和轨迹的绘制的实现
Oct 11 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
Dec 20 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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
JTrackBar水平拖动效果
2007/07/15 Javascript
JavaScript 函数调用规则
2009/09/14 Javascript
Javascript delete 引用类型对象
2013/11/01 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
Javascript的闭包详解
2014/12/26 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
python getopt详解及简单实例
2016/12/30 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
高一英语教学反思
2014/01/22 职场文书
幼教简历自我评价
2014/01/28 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
关于青春的演讲稿500字
2014/08/22 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
律师函格式范本
2015/05/27 职场文书
MySql分区类型及创建分区的方法
2022/04/13 MySQL