如何在sync中等待异步函数

问题描述 投票:0回答:1

我在一个类中有一个函数,它运行每个帧(在babylonjs中)。它的目的是加载 3D 图块并设置网格。

        if (!mesh) {
          // this.loadTile is async!
          const newTile = this.loadTile(updatedTile)
          if (newTile) {
            this.tiles.add(tileKey, newTile)
          }
        } else {
          // do some other magic
          this.tiles.add(tileKey, updatedTile)
        }

每个帧(或更新)我检查是否有该特定图块的网格。如果没有,它应该加载图块。加载它是异步的。现在 - 由于这是异步的,并且需要比一个更新周期更长的时间,因此它会过于频繁地运行 loadTile wayyyyy,因为它会检查!mesh。

这个想法是通过添加某种“待处理”来防止这种情况发生,如下所示: 添加一个具有“待处理”网格的图块,当异步 loadTile 完成时,它将替换“待处理”网格:

        if (!mesh) {
          this.tiles.add(tileKey, { updatedTile, mesh: new Mesh('pending') })

          // this.loadTile is async!
          this.loadTile(updatedTile).then((newTile) => {
            if (newTile) {
              this.tiles.add(tileKey, newTile)
            }
          })
        } else if (mesh.name !== 'pending') {
          // do some other magic
          this.tiles.add(tileKey, updatedTile)
        }

但由于某种原因它永远不会达到“else if”。 因为我在一个更新视口的函数内部,所以我无法使其异步。

有什么方法可以防止函数无休止地重复 loadTile ;) ?

非常感谢!

typescript asynchronous babylonjs
1个回答
0
投票

没关系...提供的解决方案有效。问题是我确实忘记了在这一行中传播更新的图块:

this.tiles.add(tileKey, { ...updatedTile, mesh: new Mesh('pending') })

所以这个对象是不正确的。

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.