在while循环中使用await是不好的做法

时间:2018-05-09 11:56:27

标签: javascript node.js loops asynchronous async-await

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

我有以下代码:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
....

<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<plugin>
  <groupId>org.scala-tools</groupId>
  <artifactId>maven-scala-plugin</artifactId>
  <version>2.15.0</version>
  <executions>
    <execution>
      <goals>
        <goal>compile</goal>
        <goal>testCompile</goal>
      </goals>
      <configuration>
        <args>
          <arg>-make:transitive</arg>
          <arg>-dependencyfile</arg>
          <arg>${project.build.directory}/.scala_dependencies</arg>
        </args>
      </configuration>
    </execution>
  </executions>
</plugin>
....
</plugins>
</build>
</project>

我在这里有几个问题:

  1. 可以使用两个res变量吗?
  2. 我是否会使用性能,因为我在while循环中使用await?
  3. 有更好的解决方案吗?
  4. 提前谢谢。

1 个答案:

答案 0 :(得分:5)

  

可以使用两个res变量吗?

没有。你使用内部的方式,参数中的访问总是在temporal dead zone,你将永远得到一个例外。

  

我是否会使用性能,因为我在while循环中使用await

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

  

有更好的解决方案吗?

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做了什么,但看起来你正在查询结果。如果该方法只返回在正确的时间完成的承诺,那会更好。如果那是不可能的并且您需要轮询,我建议至少在呼叫之间有一些延迟。