2017-10-15 49 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