Skip to content

Engines ​

Engines 管理脚本运行时。executeScript 会再开一套 Rhino 环境:独立堆栈、不共享当前文件的变量,也不堵住当前代码。页面按钮拉起任务、任务里再拉心跳,都走这里。

同一文件里复用函数用 require,不要再开运行时。同一运行时里并行用 Threads 或 定时器。

运行时用线程池,数量有上限。同时挂太多会抛错,不要用它当循环去「狂开」脚本。

方法作用
executeScript(filename)按文件另起运行时
executeScriptStr(name, script)按字符串另起运行时
closeAll()结束当前任务脚本运行时(须在 tasks 线程;见下文)
closeOther()结束其它运行时,留下当前这个
childScriptCount()尚未结束的子脚本个数(不含当前主任务)

路径规则和 require 不完全相同:Engines.executeScript 相对项目根(如 tasks/sample.js);require 推荐 ./、../ 相对当前文件。见 require。

javascript
Page({
    onRun: function () {
        Engines.executeScript('tasks/follow.js');
    }
});

executeScript(filename) ​

参数:

  • filename {string} 脚本路径

返回: {Thread} 新运行时对应的线程

从页面 onTap 里调时,页面还在,子脚本会继续跑。若是从一个马上要结束的任务文件里拉起子脚本,父运行时退出后子脚本也会停,需要让父运行时留着(例如 setInterval),或改由页面来拉起。

javascript
Engines.executeScript('tasks/follow.js');
Engines.executeScript('tasks/heart.js');
javascript
Engines.executeScript('tasks/heart.js');

setInterval(function () {
    console.log('父运行时保持活跃');
}, 1000);

停掉已拉起的其它脚本用 closeOther(),不要依赖子脚本自己结束。

executeScriptStr(name, script) ​

参数:

  • name {string} 任务名,给排查用,不参与执行
  • script {string} 要执行的源码

返回: {Thread} 新运行时对应的线程

没有现成文件、或源码是运行时拼出来的,用这个。新环境同样和当前脚本完全隔离。

javascript
Engines.executeScriptStr('heartbeat', "console.log('online');");

closeAll() ​

结束当前任务脚本上的运行时:本脚本、其用 Engines 拉起的子脚本,以及它们里面的定时器、Socket 等。须在 tasks/*.js 执行线程内调用,用于自动结束。调用之后,当前这段代码也不会再往下走。

不能在悬浮球菜单回调里用它停整项任务(回调不在任务脚本线程)。

场景用什么
任务内部自动结束Engines.closeAll()
用户点悬浮球菜单停止(手动)FloatWindow.stopTask()
非任务脚本线程触发的整项结束FloatWindow.stopTask()
javascript
// tasks/*.js 内自动结束
if (done) {
  Engines.closeAll();
}

closeOther() ​

结束除当前之外的运行时(含那些运行时里的子脚本、定时器、Socket)。当前这段继续执行。

当前任务要歇一会、把控制权交给另一段脚本,醒来后再把那段清掉,用这个,而不是 closeAll()。

javascript
Engines.executeScript('tasks/other.js');
System.sleep(60 * 1000);
Engines.closeOther();

childScriptCount() ​

返回: {number} 尚未结束的子脚本个数。页面或任务里拉起的第一个是主任务,不计入;主任务里再 executeScript / executeScriptStr 的才算。

相关页 ​