好吧在文章開始之前, 我想糾正一個名稱上的說法, Autojs的用戶目前來看分為三大類:
還在使用開源版的用戶, 免費 版本號截止到4.1.1之前
使用Pro8.0版本的用戶, 該版本不包含node引擎,只有Rhino引擎
使用Pro9.0版本的用戶, 該版本包含Node和Rhino兩個引擎
免費版我們就稱為免費版, Pro8.0版本,直接說8.0版本或者pro8,同理9.0一樣9.0版本或者pro9, 現在對于8.0和9.0的autojs存在很多叫法, 這種叫法非常容易和別的概念混淆,什么V8. V9 V8引擎, 一代引擎, 二代引擎,各種奇葩叫法, 請放棄這些花里胡哨的說法, 直接回歸最基本的名稱好吧,方便大家溝通, 另外一代 二代的叫法只是對于文檔來說的.
8.0版本中只有rhino引擎,它使用的是JavaScript ES5標準,另外有少許的ES6特性,使用時,閱讀官網的一代文檔, 8.0不包含NodeJS引擎,也就是說,Nodejs的代碼無法在8.0版本中運行;
9.0版本中包含8.0版本的Rhino引擎,使用方法和8.0一樣,開發文檔使用一代文檔(注意不要稱為一代引擎), 另外從9.0版本開始加入了Node引擎,可以使用nodejs來開發項目,node引擎使用的是二代文檔, Node引擎和Rhino引擎都可以在pro9.x版本以上使用.
因此,如果你使用的是Pro9.x版本,遇到問題, 請像這樣描述: "我使用的是Pro9, 代碼開發使用的是rhino引擎, 在運行時遇到下列錯誤...", "我使用的是9.0版本,使用的是Node引擎開發環境, 運行代碼時發生這樣的錯誤..."
正文開始: (不好意思忍不住吐槽了一下.)
昨天,又遇到來問,JS代碼中怎么暫停/繼續代碼的執行,之前一直不想做這個功能, 因為JS本身在運行時,就不支持暫停,如果非要做暫停的話. 我能給出的方案,只有使用死循環來暫停運行, 其大概原理, 循環判斷某個屬性的值是否符合預期,如果符合,就暫停運行, 不符合了就跳出循環,繼續執行下方的代碼, 并且呢,這個死循環,要加到代碼的每一行中.
呵~這種做法,TMD聽起來就有點離譜.既然非得要,那必然得犧牲點什么罷...
那么,干貨來了, 下面的代碼是封裝好的一個模塊:
module.exports = ( function() {
let MianThread;
let IsRun = false;
let IsPause = false;
//就是在要運行的代碼中逐行插入這句代碼...
let PauseFun = "while( true ){ if ( !IsPause ) { break; } sleep( 10 ); }";
this.SetRunState = function( state ) {
IsRun = state;
}
this.GetRunState = function() {
return IsRun;
}
this.SetPauseState = function( state ) {
IsPause = state;
}
this.GetPauseState = function () {
return IsPause;
}
/**
* 保證功能不會被重復運行.
* @param {*} main 要執行的功能函數
* @returns void
*/
this.RunScript = ( main ) => {
try {
if ( this.GetRunState() ) {
toastLog( "該功能正在運行,無法重復運行" );
return;
}
let mainStr = main.toString();
let mainStrArry = mainStr.split( "\\n" );
let mainFunStr = "";
for ( let i in mainStrArry ) {
if ( mainStrArry[ i ] == "" ) continue;
if ( i <= mainStrArry.length - 3 ) {
mainFunStr += mainStrArry[ i ] + "\\n" + PauseFun + "\\n";
}
}
mainFunStr += "}";
main = eval( mainFunStr );
// log(main.toString());
this.SetRunState( true );
MianThread = threads.start( main );
} catch ( e ) {
toastLog( "[ CATCH_INFO ]: " + e );
this.SetRunState( false );
return;
}
//等待運行腳本的線程執行完成,改變狀態
threads.start( () => {
if ( MianThread ) {
MianThread.join();
this.SetRunState( false );
}
} );
}
this.Stop = function() {
if ( this.GetRunState() ) {
MianThread.interrupt();
}
}
this.Pause = function() {
if ( !this.GetPauseState() ) {
this.SetPauseState( true );
console.log("當前邏輯已暫停!");
} else {
console.log( "繼續執行代碼邏輯" );
this.SetPauseState( false );
}
}
return this;
} )()
模塊中封裝了幾個方法, 通過兩個屬性的bool值去控制 傳入方法的運行狀態. 在使用runScript( main ); 方法時, 對于傳入的main函數,進行重新封裝,逐行插入死循環代碼...然后再運行這個函數. 在線程外通過Pause()方法去控制暫停和繼續.然后寫一個簡單的demo.
"ui";
$ui.layout(
"*" gravity="center|center_horizontal|center_vertical">
"center|center_horizontal|center_vertical" margin="20" cardCornerRadius="8dp" cardElevation="5dp" >
"20 10" gravity="center|center_horizontal|center_vertical">
"16sp">運行結果: class="hljs-name"text>
"runResult" inputType="text" singleLine="true" gravity="center" w="*" h="60" textSize="18sp" />
class="hljs-name"linear>
"center" >
-
JS
+關注
關注
0文章
78瀏覽量
18126 -
循環
+關注
關注
0文章
92瀏覽量
16001 -
代碼
+關注
關注
30文章
4801瀏覽量
68734
發布評論請先 登錄
相關推薦
評論