逃离双矢量箔

JavaScriptJavaScriptBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个项目中,你将学习如何开发一个 RequestControl 类,该类收集航天器的发射请求,并根据航天器的结果自动安排下一批航天器的发射。这将帮助人类摆脱三体问题中“双矢箔”的影响,它将三维空间坍缩成二维平面。

👀 预览

航天器发射模拟预览

🎯 任务

在这个项目中,你将学习:

  • 如何在 RequestControl 类中实现 run 函数来处理航天器的发射。
  • 如何使用 render 函数在页面上呈现发射结果。

🏆 成果

完成这个项目后,你将能够:

  • 使用 Promise 模拟航天器发射过程。
  • 管理发射队列并控制一次可发射的航天器数量。
  • 更新用户界面以显示发射结果。

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL javascript(("`JavaScript`")) -.-> javascript/BasicConceptsGroup(["`Basic Concepts`"]) javascript(("`JavaScript`")) -.-> javascript/AdvancedConceptsGroup(["`Advanced Concepts`"]) javascript(("`JavaScript`")) -.-> javascript/DOMManipulationGroup(["`DOM Manipulation`"]) javascript(("`JavaScript`")) -.-> javascript/NetworkingGroup(["`Networking`"]) javascript/BasicConceptsGroup -.-> javascript/array_methods("`Array Methods`") javascript/AdvancedConceptsGroup -.-> javascript/async_prog("`Asynchronous Programming`") javascript/AdvancedConceptsGroup -.-> javascript/error_handle("`Error Handling`") javascript/DOMManipulationGroup -.-> javascript/dom_manip("`DOM Manipulation`") javascript/DOMManipulationGroup -.-> javascript/event_handle("`Event Handling`") javascript/NetworkingGroup -.-> javascript/http_req("`HTTP Requests`") subgraph Lab Skills javascript/array_methods -.-> lab-299863{{"`逃离双矢量箔`"}} javascript/async_prog -.-> lab-299863{{"`逃离双矢量箔`"}} javascript/error_handle -.-> lab-299863{{"`逃离双矢量箔`"}} javascript/dom_manip -.-> lab-299863{{"`逃离双矢量箔`"}} javascript/event_handle -.-> lab-299863{{"`逃离双矢量箔`"}} javascript/http_req -.-> lab-299863{{"`逃离双矢量箔`"}} end

设置项目结构

在这一步中,你将设置项目文件和结构。按照以下步骤完成此步骤:

打开项目文件夹。目录结构如下:

├── index.html
└── main.js

其中:

  • index.html 是主页。
  • main.js 是需要补充代码的js文件。

main.js 文件中:

  • createRequest 方法是一个用于发起航天器发射请求的 promise
  • RequestControl 类的 addRequest 方法收集航天器的发射请求。航天器发射请求被放置在 this.requestQueue 发射队列中。
  • run 方法根据发射结果自动安排下一批航天器的发射。
  • render 方法用于在页面上呈现发射结果。

max = 2 为例,航天器发射过程如下:

航天器发射过程图

点击WebIDE右下角的上线按钮来运行项目。最初它没有效果。

RequestControl 类中实现 run 函数

在这一步中,你将在 RequestControl 类中实现 run 函数,以便根据发射结果自动安排下一批航天器的发射。

  1. 打开提供的项目中的 main.js 文件。
  2. RequestControl 类中找到 run 函数。
  3. run 函数内部,添加以下代码来处理航天器的发射:
run() {
  // 获取请求队列的长度
  let len = this.requestQueue.length;

  // 如果请求队列为空,则返回
  if (len === 0) return;

  // 获取航天器最大数量和请求队列长度中的最小值
  let min = Math.min(this.max, len);

  // 逐个发射航天器
  for (let i = 0; i < min; i++) {
    // 可发射的航天器最大数量减一
    this.max--;

    // 从队列中获取下一个请求
    let req = this.requestQueue.shift();

    // 发射航天器并处理结果
    req()
   .then((res) => {
      this.render(res);
    })
   .catch((error) => {
      this.render(error);
    })
   .finally(() => {
      // 可发射的航天器最大数量加一
      this.max++;
      // 递归调用 run 函数以发射下一批航天器
      this.run();
    });
  }
}

实现的关键点如下:

  1. 获取请求队列的长度(this.requestQueue.length)。
  2. 如果请求队列为空,则返回。
  3. 获取航天器最大数量和请求队列长度中的最小值(Math.min(this.max, len))。
  4. 逐个发射航天器,可发射的航天器最大数量减一(this.max--)。
  5. 使用 req() 返回的 Promise 的 thencatch 方法处理航天器发射的结果。
  6. 可发射的航天器最大数量加一(this.max++)并递归调用 run 函数以发射下一批航天器。

测试项目

  1. 保存 main.js 文件。
  2. 在浏览器中刷新网页。
  3. 观察页面上显示的发射结果。页面应显示航天器的成功发射和失败发射情况。

最终页面效果如下:

航天器发射结果显示

恭喜!你已经完成了 RequestControl 类的实现,以自动安排航天器的发射。该项目现在应该可以完全正常运行了。

✨ 查看解决方案并练习

总结

恭喜!你已经完成了这个项目。你可以在LabEx中练习更多实验来提升你的技能。

您可能感兴趣的其他 JavaScript 教程