diff --git a/autojs/src/main/assets/init.js b/autojs/src/main/assets/init.js index e53aae475..63083a677 100644 --- a/autojs/src/main/assets/init.js +++ b/autojs/src/main/assets/init.js @@ -39,7 +39,7 @@ runtime.init(); global.keyboard = Object.create(runtime.keyboard); global.process = require('process') - global.Promise = require('bluebird'); + // global.Promise = require('bluebird'); //初始化全局函数 diff --git a/autojs/src/main/java/com/stardust/autojs/rhino/AndroidContextFactory.kt b/autojs/src/main/java/com/stardust/autojs/rhino/AndroidContextFactory.kt index acfd0317a..c5e352c2a 100644 --- a/autojs/src/main/java/com/stardust/autojs/rhino/AndroidContextFactory.kt +++ b/autojs/src/main/java/com/stardust/autojs/rhino/AndroidContextFactory.kt @@ -66,6 +66,20 @@ open class AndroidContextFactory(private val cacheDirectory: File) : ContextFact context.languageVersion = Context.VERSION_ES6 context.locale = Locale.getDefault() context.wrapFactory = wrapFactory + context.setTrackUnhandledPromiseRejections(true) + } + + override fun doTopCall( + callable: org.mozilla.javascript.Callable, + cx: Context, + scope: Scriptable, + thisObj: Scriptable?, + args: Array + ): Any? { + val result = super.doTopCall(callable, cx, scope, thisObj, args) + // 处理 Promise microtask 队列 + cx.processMicrotasks() + return result } override fun onContextCreated(cx: Context) { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptBridges.kt b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptBridges.kt index e62fdff75..90a3ac2fd 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptBridges.kt +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptBridges.kt @@ -44,6 +44,11 @@ class ScriptBridges { (Context.javaToJS(target, scope) as? Scriptable) ?: Undefined.SCRIPTABLE_UNDEFINED, arg ) + // 不经过 doTopCall,需要单独处理 microtask + context.processMicrotasks() + context.getUnhandledPromiseTracker().process { reason -> + engine?.runtime?.console?.log("Unhandled Promise rejection: $reason") + } } catch (e: Exception) { if (Looper.getMainLooper() == Looper.myLooper()) { engine?.runtime?.exit(e) ?: throw e