asynchronous等待使用和error handling的困境

这两个尝试的打印Promise { <pending> }和第二个有一个Unhandled Promise Rejection Warning 。 我已经成功地使用Promise与.then和.catch,但是还有一些我想使用async / await以更多的同步方式进行编码。 我是否应该用Yield来代替?

 try { var tokens = getNewTokens('refresh-token', 1) console.log(tokens) } catch (error) { console.log(error.message) } try { tokens = getNewTokens('no-such-refresh-token', 1) console.log(tokens) } catch (error) { console.log(error.message) } function getRefreshToken (refreshToken, userId) { return new Promise((resolve, reject) => { if (refreshToken === 'refresh-token' && userId === 1) { return resolve({ refreshToken: 'refresh-token', accessToken: 'jwt' }) } else { const error = Error('Refresh token not found') return reject(error) } }) } async function getNewTokens (refreshToken, userId) { if (!refreshToken || !userId) { throw Error('Missing params') } try { var result = await getRefreshToken(refreshToken, userId) } catch (error) { throw Error(error.message) } if (!result) { throw Error('Something went bonk') } // Do stuff.. // get user from DB // update refresh token with a new one // make new jwt return { user: { id: 1, name: 'Jerry', role: 'admin' }, newRefreshToken: 'new-refresh-token', newAccessToken: 'new-jwt' } } 

使用asyncawait不会使整个程序asynchronous。 它使特定的functionasynchronous。 最后, async是语法糖,使写代码更容易。

一个async函数返回一个Promise 。 调用asynchronous函数的代码必须将其视为返回承诺的函数。 (唯一例外的情况是,调用async函数的代码本身就是一个async函数,在这种情况下可以await )。

所以抛出一个Error被转化为Promise拒绝。 你不能在try..catch块中捕获它,原因很简单,在错误被引发之前try..catch已经结束了。 (同样,exception是当你从一个async函数中调用它的时候,如果你正在await一个asynchronous函数,一个try..catch块将会工作,在这种情况下try..catch块被当作是添加一个Promise#catch函数。)

你最终必须使用普通的Promise#catch方法或Promise#catch的第二个参数从async函数中捕获错误:

 getNewTokens('no-such-refresh-token', 1) .then(function(tokens) { console.log(tokens); }, function(error) { console.log(error.message); });