Engines
Engines 管理脚本运行时。executeScript 会再开一套 Rhino 环境:独立堆栈、不共享当前文件的变量,也不堵住当前代码。页面按钮拉起任务、任务里再拉心跳,都走这里。
同一文件里复用函数用 require,不要再开运行时。同一运行时里并行用 Threads 或 定时器。
运行时用线程池,数量有上限。同时挂太多会抛错,不要用它当循环去「狂开」脚本。
| 方法 | 作用 |
|---|---|
executeScript(filename) | 按文件另起运行时 |
executeScriptStr(name, script) | 按字符串另起运行时 |
closeAll() | 结束当前任务脚本运行时(须在 tasks 线程;见下文) |
closeOther() | 结束其它运行时,留下当前这个 |
childScriptCount() | 尚未结束的子脚本个数(不含当前主任务) |
路径规则和 require 不完全相同:Engines.executeScript 相对项目根(如 tasks/sample.js);require 推荐 ./、../ 相对当前文件。见 require。
Page({
onRun: function () {
Engines.executeScript('tasks/follow.js');
}
});executeScript(filename)
参数:
filename {string}脚本路径
返回: {Thread} 新运行时对应的线程
从页面 onTap 里调时,页面还在,子脚本会继续跑。若是从一个马上要结束的任务文件里拉起子脚本,父运行时退出后子脚本也会停,需要让父运行时留着(例如 setInterval),或改由页面来拉起。
Engines.executeScript('tasks/follow.js');
Engines.executeScript('tasks/heart.js');Engines.executeScript('tasks/heart.js');
setInterval(function () {
console.log('父运行时保持活跃');
}, 1000);停掉已拉起的其它脚本用 closeOther(),不要依赖子脚本自己结束。
executeScriptStr(name, script)
参数:
name {string}任务名,给排查用,不参与执行script {string}要执行的源码
返回: {Thread} 新运行时对应的线程
没有现成文件、或源码是运行时拼出来的,用这个。新环境同样和当前脚本完全隔离。
Engines.executeScriptStr('heartbeat', "console.log('online');");closeAll()
结束当前任务脚本上的运行时:本脚本、其用 Engines 拉起的子脚本,以及它们里面的定时器、Socket 等。须在 tasks/*.js 执行线程内调用,用于自动结束。调用之后,当前这段代码也不会再往下走。
不能在悬浮球菜单回调里用它停整项任务(回调不在任务脚本线程)。
| 场景 | 用什么 |
|---|---|
| 任务内部自动结束 | Engines.closeAll() |
| 用户点悬浮球菜单停止(手动) | FloatWindow.stopTask() |
| 非任务脚本线程触发的整项结束 | FloatWindow.stopTask() |
// tasks/*.js 内自动结束
if (done) {
Engines.closeAll();
}closeOther()
结束除当前之外的运行时(含那些运行时里的子脚本、定时器、Socket)。当前这段继续执行。
当前任务要歇一会、把控制权交给另一段脚本,醒来后再把那段清掉,用这个,而不是 closeAll()。
Engines.executeScript('tasks/other.js');
System.sleep(60 * 1000);
Engines.closeOther();childScriptCount()
返回: {number} 尚未结束的子脚本个数。页面或任务里拉起的第一个是主任务,不计入;主任务里再 executeScript / executeScriptStr 的才算。
