React/Redux應用使用Async/Await

來源:互聯網
上載者:User
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 (            <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 外掛程式來轉換其成為瀏覽器支援的文法,雖然沒有效能的提升,但對於代碼編寫體驗要更好。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.