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' } }
使用async
和await
不会使整个程序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); });