2017-10-15 51 views
4

我很新的異步/等待,並想知道,什麼是最好的方式來重構下面的代碼與異步/等待?如何用async/await重構這個函數?

export const createUser = (values, history) => { 
    return dispatch => { 
    axios.post('/api/signup', values) 
     .then(res => { 
     console.log('result', res); 
     }, rej => { 
     console.log('rejection', rej); 
     }); 
    } 
} 

當只有一個參數提供給.then它是非常簡單的給我,但如果你有兩個參數喜歡這裏,而不是會發生什麼?

+2

你可能只是想[不會改變它在所有(https://stackoverflow.com/a/44664037/1048572)當「等待」不會提高清晰度。 – Bergi

+0

這裏的另一個問題是該函數不返回任何東西,因此調用者無法知道'axios.post()'何時完成和/或是否有錯誤。您應該返回承諾,您的拒絕處理程序也需要傳播錯誤,並且您的成功處理程序需要返回該值。 – jfriend00

回答

2

.then的兩個參數只是成功和錯誤回調。你也可以這樣寫:.then(res => {}).catch(rej => {})

基本上你可以把await的結果看作.then的回調函數。任何時候您在等待承諾的結果,無論您是否使用它,請使用await.對於任何錯誤,請使用通常的try/catch

return async() => { 
    try { 
    const res = await axios.post('/api/signup', values); 
    console.log('result', res); 
    } 
    catch (rej) { 
    console.log('rejection', rej); 
    } 
} 

有一點要記住的是,async功能總是返回一個Promise,所以調用的代碼已被寫入考慮到這一點。

我寫了一篇關於async/await的博客文章(免責聲明,是寫了這個)。 1

+2

不,你不能真的,有'.then(...,...)'和'.then(...).catch(...)']之間的區別(https://stackoverflow.com/q/24662289/ 1048572)這可能很重要。 – Bergi

+0

@Bergi謝謝你指出。在這個特定的情況下,我不認爲這很重要,因爲'console.log'不會失敗,但是知道這個區別很重要。 –

+0

我不會那麼肯定的。也許它可能在它寫入的stdout流發生錯誤時拋出?也許有人甚至與'console'全局對象搞混了?或者一個不那麼人爲的例子(我實際上已經看到在野外發生)將是'res'的字符串化的一個例外。 – Bergi