视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
React/Redux应用使用Async/Await的方法
2020-11-27 22:25:41 责编:小采
文档

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 插件来转换其成为浏览器支持的语法,虽然没有性能的提升,但对于代码编写体验要更好。

下载本文
显示全文
专题