博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React/Redux应用使用Async/Await
阅读量:4084 次
发布时间:2019-05-25

本文共 3187 字,大约阅读时间需要 10 分钟。

Async/Await

Async/Await是尚未正式公布的ES7标准新特性。简而言之,就是让你以同步方法的思维编写异步代码。对于前端,异步任务代码的编写经历了 callback 到现在流行的 Promise ,最终会进化为 Async/Await 。虽然这个特性尚未正式发布,但是利用babel polyfill我们已经可以在应用中使用它了。

http://www.tuicool.com/articles/B77zAbe

现在假设一个简单的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 (            
) }}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 (            
) }}export default connect(null, dispatch => { return { createPost: params => dispatch(createPost(params)) }})(PostEditForm)

可以见得,两种模式, Async\Await 的更加直观和简洁,是未来的趋势。但是目前,还需要利用babel的 transform-async-to-module-method 插件来转换其成为浏览器支持的语法,虽然没有性能的提升,但对于代码编写体验要更好。

转载地址:http://gurni.baihongyu.com/

你可能感兴趣的文章
应用AI芯片加速 Hadoop 3.0 纠删码的计算性能
查看>>
Hadoop 3.0 纠删码技术分析(Erasure Coding)
查看>>
Hadoop EC的一个实现:
查看>>
hadoop3 EC测试
查看>>
HDFS 纠删码
查看>>
基于柯西矩阵的Erasure Code技术详解
查看>>
基于范德蒙矩阵的Erasure code技术详解
查看>>
一个IO的传奇一生(12)-- 磁盘阵列1
查看>>
主定理的证明及应用举例
查看>>
线性判别分析(Linear Discriminant Analysis,LDA) 简单分析
查看>>
leetcode刷题(五):分治算法
查看>>
【算法】动态规划算法—买卖股票的最佳时机系列(1-4)
查看>>
想从事分布式系统,计算,hadoop等方面,需要哪些基础,推荐哪些书籍?--转自知乎
查看>>
【经验总结】如何找方向相关(计算机)的论文
查看>>
计算机论文查找
查看>>
计算机方向学术入门经验
查看>>
大牛博士是如何进行文献检索和阅读(好习惯受益终生)
查看>>
【转】台湾教授-如何阅读科研论文
查看>>
《如何写好科研论文》
查看>>
最大长方形 (Maximum Submatrix & Largest Rectangle)(涵盖各种求最大矩形题目)
查看>>