报名参加即将到来的黑客马拉松大赛!奖金为总额超过 25 万美元的 MANA 和 LAND 。
X
你好,请选择
语言:
关闭

异步代码

概述

场景中的大多数代码在单个线程中同步运行。意味着代码是逐行顺序执行的。每条指令必须先等待上一条指令完全执行完才会启动。

甚至场景系统中的 update() 函数也是按照优先级一个接一个地执行的。

同步运行代码可以确保一致性,因为可以确定代码指令的运行顺序。

另一方面,场景需要每秒更新许多次来构建下一帧。 如果一部分代码需要很长时间才能响应,那么整个主线程就会卡住,从而导致帧速率滞后。

就就是为什么,在某些特殊情况下,有些指令需要异步方式运行。这样就可以执行一项任务,然后不用等待该任务返回结果的情况下执行下一行代码。

这对于需要时间响应的外部服务非常有用。这样不会因为等待响应而阻止其他任务执行。

例如:

  • 播放声音文件
  • 从 REST API 获取数据
  • 在区块链上执行交易

executeTask 函数

executeTask 函数在与场景主线程不同的线程中异步执行 lambda 函数。

// Start an asynchronous task
executeTask(async () => {
  try {
    let response = await fetch(callUrl)
    let json = await response.json()
    log(json)
  } catch {
    log("failed to reach the URL")
  }
})

// Rest of the code keeps being executed

上面的示例执行一个函数,该函数包含一个 fetch() 操作,用于从外部 API 检索数据。在执行此异步过程时,场景中的其余代码将继续执行。

注意:请记住,在任务完成执行之前,可能已经渲染了几帧场景。确保场景的代码足够灵活,以便在异步任务完成时处理中间场景。

OnClick 函数

您可以向任何实体添加一个 OnCLick 组件,以便在每次单击该实体时触发异步 lambda 函数。

myEntity.addComponent(
  new OnClick(e => {
    log("clicked on the entity", e)
  })
)

订阅监听器

运行异步代码的另一种方法是实例化事件监听器。每次发生给定事件时,事件侦听器都会触发异步 lambda 函数的运行。

//Instance the Input object
const input = Input.instance

// Subscribe to an event
input.subscribe("BUTTON_DOWN", e => {
  log("pointerUp works", e)
})

上面的示例在每次按下按钮 A 时,都会运行函数。