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 Event事件学习第一章 Event介绍
Feb 07 Javascript
浅谈Javascript 执行顺序
Dec 18 Javascript
Angular 根据 service 的状态更新 directive
Apr 03 Javascript
全面解析Angular中$Apply()及$Digest()的区别
Aug 04 Javascript
微信小程序 PHP生成带参数二维码
Feb 21 Javascript
详解Node.js开发中的express-session
May 19 Javascript
深入浅析Vue不同场景下组件间的数据交流
Aug 15 Javascript
Angular4 ElementRef的应用
Feb 26 Javascript
vue项目每30秒刷新1次接口的实现方法
Dec 04 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
May 14 jQuery
js最全的数组的降维5种办法(小结)
Apr 28 Javascript
vue 项目@change多个参数传值多个事件的操作
Jan 29 Vue.js
详谈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
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
PHP简单选择排序算法实例
2015/01/26 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
PHP xpath()函数讲解
2019/02/11 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
Python 基础知识之字符串处理
2017/01/06 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
python可视化实现KNN算法
2019/10/16 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
《寓言两则》教学反思
2014/02/27 职场文书
临床护理求职信
2014/04/26 职场文书
跳槽求职信范文
2014/05/26 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
三严三实对照检查材料
2014/09/22 职场文书
党员作风建设自查报告
2014/10/23 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
高考1977观后感
2015/06/04 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python
解读Vue组件注册方式
2021/05/15 Vue.js
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server