首页 > 解决方案 > 在 while 循环中使用 await 是一种不好的做法吗

问题描述

在 while 循环中使用 await 是一种不好的做法吗?

我有以下代码:

// this is inside a async function
try {
  let res = await api.resource.create(...args) // create resource
  do {
    let res = await api.resource.show(res.body.id)
    if (res.body.status === 'COMPLETED')
      return res.body
  } while(1)
} catch (err) {
  errorHandler(err)
}

我在这里有几个问题:

  1. 可以使用两个 res 变量吗?
  2. 我要使用性能,因为我在 while 循环中使用 await 吗?
  3. 有没有更好的解决方案?

先感谢您。

标签: javascriptnode.jsloopsasynchronousasync-await

解决方案


可以使用两个res变量吗?

不,你使用内部的方式,参数中的访问总是在时间死区,你总是会得到一个异常。

我要使用性能,因为我使用的await是 while 循环内部吗?

使用awaitin 循环没有任何问题,只要您希望它们按顺序运行而不是所有迭代同时运行。

有更好的解决方案吗?

try {
  let res = await api.resource.create(...args) // create resource
  do {
    res = await api.resource.show(res.body.id)
  } while (res.body.status !== 'COMPLETED')
  return res.body
} catch (err) {
  errorHandler(err)
}

另请注意,如果errorHandler来自回调参数,则应删除整个try/catch并仅.catch(errorHandler)在调用返回的承诺上使用。

另外,虽然我不知道是什么api.resource.show,但看起来您正在轮询结果。如果该方法只返回一个在正确的时间实现的承诺会更好。如果这是不可能的并且您需要轮询,我建议至少在通话之间延迟一些时间。


推荐阅读