两个都尝试打印Promise { <pending> },并且第二个都有一个Unhandled Promise Rejection Warning。我在.then和.catch中使用Promises已经取得了成功,但我希望使用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'
}
}发布于 2017-01-24 02:27:56
使用async和await并不能使整个程序成为异步的。它使特定的函数异步。最后,async是语法上的糖,它使编写promise代码变得更容易。
async函数返回一个Promise。调用异步函数的代码必须将其视为返回promise的函数。(唯一的例外是当调用async函数的代码本身在async函数中时,在这种情况下它可以被await。)
所以抛出一个Error会转化为一个Promise拒绝。您不能在try..catch块中捕获它,原因很简单,因为try..catch在抛出错误之前就已经结束了!(同样,当您从async函数调用它时是个例外。如果你正在await一个异步函数,一个try..catch块将会工作。在本例中,try..catch块被视为添加了一个Promise#catch函数。)
最终,您必须使用普通的Promise#catch方法或使用Promise#then的第二个参数从async函数捕获错误
getNewTokens('no-such-refresh-token', 1)
.then(function(tokens) {
console.log(tokens);
}, function(error) {
console.log(error.message);
});发布于 2018-09-07 13:38:52
我想提交这是一个合理的和可读性的方式来处理错误使用异步/等待。
const value = await asyncFunction().catch(err => new Error(err))
if (value instanceof Error) return res.status(500).send('There was an error doing something')通过添加返回Error的.catch()方法,从而将其赋值给value变量,我们可以确保变量中会出现一些值。唯一需要的额外代码行是用于测试值是否为Error实例的if语句。如果它由于任何原因被捕获,它肯定是一个instanceof错误(我们的代码确保了这一点),我们的程序可以安全地处理这种情况(在上面的情况下,我们返回500作为服务器响应,从而防止程序由于asyncFunction中的错误而执行任何危险代码)。
我特意把这篇文章写成两行,以强调这样一个事实,即这篇文章可以写得很简洁,并避免使用try/catch代码块,因为很多人不喜欢阅读这些代码块(我自己就是其中之一)。
如果你喜欢阅读try/catch代码块,恭喜你。我只是发现它让代码看起来很简陋。哦,好吧。¯\_(ツ)_/¯
发布于 2018-02-03 07:02:03
给异步/等待和错误处理方面的初学者的实用答案
不能在未使用async声明或为promise的函数外部使用await语法。
async function myAsyncFunction() {
// code
}或
const myPromiseFunction = () => new Promise((resolve, reject) => {
// code
})因此,最终必须使用旧的Promise方法来使用声明为async的函数
myAsyncFunction().then(() => console.log('here'));因为两者都是承诺。
现在,要像你习惯的那样用then-catch方式处理错误,你必须像这样构造你的异步函数……
async function getUser(username) {
return await db.users.get({ username });
}然后你就可以像普通的Promise一样在异步方法之外使用它,就像这样……
getUser()
.then(user => console.log(user))
.catch(err => console.error(err));或者你猜对了,在使用await的异步函数中使用它。
async function getJoffery() {
return await getUser('joffery');
}https://stackoverflow.com/questions/41813016
复制相似问题