ECMA JavaScript 规范将该语言描述为面向对象的编程语言,用于在主机环境中执行计算和处理计算对象。每个用 JavaScript 编写的应用程序都需要一个主机环境,它提供特定于环境的对象和 API 来执行 I / O。 Ringo 为 JavaScript 提供了这样一个环境,并附带一组模块以使应用程序开发更容易。由于其作为通用编程语言的特性,JavaScript 可以用来解决各种各样的问题,而 Ringo 可以帮助您这么做。利用 Ringo,编写命令行工具,复杂的 Web 应用程序甚至基于 Java UI 技术的 GUI 应用程序都很容易。
脚本语言如 JavaScript 需要一个引擎来解释和执行程序。 Ringo 没有自己的引擎。相反,它使用 Mozilla Rhino,一种 Java 中的 JavaScript 实现。犀牛的最初发展始于 Netscape 时代,并一直持续到现在。基本思想是将 JavaScript 程序编译为 Java 字节码,Java 字节码可以由 Java 虚拟机(JVM)执行。犀牛还提供了对 Java 标准类库和其他每个 Java 类的轻松访问。这使得将现有的 Java 库集成到新的 JavaScript 应用程序变得很容易。例如:Ringo 不是编写自己的 I / O 系统,而是使用现有的 Java I / O 类,并将它们封装起来以提供从 JavaScript 更容易的访问。
Ringo 在服务器或专用机器上执行 JavaScript,而不是在 Web 浏览器上下文中执行。如果您已经从基于 HTML 的应用程序中了解 JavaScript,则这是主要区别。没有什么像一个窗口对象,你没有一个 DOM 来操纵 HTML 对象。尽管如此,很多事情会像你从浏览器中知道的那样。您可以使用 console.log() 调试到控制台,但也有专用的日志记录模块可用于更复杂的日志记录。
Ringo 最大的优势之一就是模块系统。 Ringo 并没有自己构建代码,而是拥有一个易于使用的模块系统。它基于 CommonJS 模块,这是用于保持代码可互换的服务器端 JavaScript 环境的规范。如果您了解 Node.js 的模块,您还知道如何在 Ringo 中编写模块。一个模块封装了 JavaScript 方法和变量,并将它们与其他模块隔离。
基于 W3C Web Workers 的 Worker API。 Ringo为平行执行和抽象JVM线程提供“无共享” worker. worker有它自己的一组模块和一个独立的作用域,并在一个JVM线程中。 每个worker都有自己的单线程事件循环,其行为与浏览器或节点中的事件循环相似。worker之间的通信使用postMessage()方法和onmessage事件处理程序。 为了提高性能,Ringo将空闲worker保留在队列中,并且只有当所有现有worker都忙时才分配新的worker。worker有助于保持多线程JavaScript不受任何常见线程陷阱的影响,如同步或锁定。
See
Simple worker example
RingoJS: Workers and Multithreading
一个Worker线程在 W3C Web Worker API 之后松散地建模。
moduleId参数必须是要在Worker中加载的模块的完全解析ID。为了能够使用postMessage方法将消息发送到Worker,模块必须定义(尽管不一定导出)onmessage函数。
Worker对它们自己的一组模块进行操作,因此即使模块已经加载到当前线程中,或者与当前正在执行的模块相同,也会创建该模块的新实例。 因此,每个Worker都在其私有模块环境中运行,使得并发编程比共享状态多线程更可预测。
来自Worker的回调的事件监听器可以通过将它们分配给Worker的onmessage和onerror属性来注册。
为了在Worker不再需要Worker时释放Worker的线程和其他资源,应该调用它的终止方法。
Parameters
String | moduleId | the id of the module to load in the worker. |
See
RingoJS: Workers and Multithreading
向Worker发布消息。这会将消息排入Worker的输入队列并立即返回。 Worker线程将接收到消息并将其传递给onmessage函数。
传递给onmessage的参数是一个包含消息的data属性的对象,以及包含带postMessage和postError方法的对象的源属性,允许Worker发布消息或将错误报告给原始调用者。
如果syncCallbacks为true,则来自Worker的回调将在Worker自己的线程上运行,而不是我们的本地事件循环线程。 这允许在本地线程忙于做其他事情时同时传递回调。
请注意,与 Web Workers 规范相反,此Worker实现不需要消息的JSON序列化。
Parameters
Object | data | the data to pass to the worker |
Boolean | [syncCallbacks] | flag that indicates whether callbacks from the worker should be called synchronously in the worker's own thread rather than in our own local event loop thread. |
释放Worker,将其返回到引擎的Worker池。 请注意,这不会终止Worker线程,也不会从其事件循环中移除任何当前或未来的计划任务。
这将使用给定的moduleId创建一个新的Worker,并使用消息参数调用它的postMessage函数。 从Worker返回的第一条消息或错误将用于解析Promise.
Worker在解析Promise后立即终止。
Parameters
String | moduleId | the id of the module to load in the worker. |
Object | message | the message to post to the worker. |
Boolean | [syncCallbacks] | flag that indicates whether callbacks from the worker should be called synchronously in the worker's own thread rather than in our own local event loop thread. |
See
注册由Worker解析Promise时将调用的回调函数和errback函数。请参 Promise.then()的文档。
Parameters
Function | callback | called if the promise is resolved as fulfilled |
Function | errback | called if the promise is resolved as failed |
Returns
Object | a new promise that resolves to the return value of the callback or errback when it is called. |
等待worker解析Promise.请参阅 Promise.wait()的文档。
Parameters
Number | timeout | optional time in milliseconds to wait for. If timeout is undefined wait() blocks forever. |
Returns
Object | the value if the promise is resolved as fulfilled |
Throws
如果Promise被解析为失败,请将错误值作为对象