首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步等待使用和错误处理问题

异步等待使用和错误处理问题
EN

Stack Overflow用户
提问于 2017-01-24 02:19:02
回答 3查看 13.4K关注 0票数 5

两个都尝试打印Promise { <pending> },并且第二个都有一个Unhandled Promise Rejection Warning。我在.then和.catch中使用Promises已经取得了成功,但我希望使用async/await以更同步的方式编写一些代码。也许我应该使用Yield来代替它呢?

代码语言:javascript
复制
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'
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-24 02:27:56

使用asyncawait并不能使整个程序成为异步的。它使特定的函数异步。最后,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函数捕获错误

代码语言:javascript
复制
getNewTokens('no-such-refresh-token', 1)
    .then(function(tokens) {
        console.log(tokens);
    }, function(error) {
        console.log(error.message);
    });
票数 23
EN

Stack Overflow用户

发布于 2018-09-07 13:38:52

我想提交这是一个合理的和可读性的方式来处理错误使用异步/等待。

代码语言:javascript
复制
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代码块,恭喜你。我只是发现它让代码看起来很简陋。哦,好吧。¯\_(ツ)_/¯

票数 12
EN

Stack Overflow用户

发布于 2018-02-03 07:02:03

给异步/等待和错误处理方面的初学者的实用答案

不能在未使用async声明或为promise的函数外部使用await语法。

代码语言:javascript
复制
async function myAsyncFunction() {
  // code
}

代码语言:javascript
复制
const myPromiseFunction = () => new Promise((resolve, reject) => {
    // code
})

因此,最终必须使用旧的Promise方法来使用声明为async的函数

代码语言:javascript
复制
myAsyncFunction().then(() => console.log('here'));

因为两者都是承诺。

现在,要像你习惯的那样用then-catch方式处理错误,你必须像这样构造你的异步函数……

代码语言:javascript
复制
async function getUser(username) {
  return await db.users.get({ username });
}

然后你就可以像普通的Promise一样在异步方法之外使用它,就像这样……

代码语言:javascript
复制
getUser()
.then(user => console.log(user))
.catch(err => console.error(err));

或者你猜对了,在使用await的异步函数中使用它。

代码语言:javascript
复制
async function getJoffery() {
  return await getUser('joffery');
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41813016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档