M8Test Help

生命周期

每个通过 launch 或 async 启动的协程都由一个 Job 对象表示,它不仅是协程的句柄,也是其生命周期状态的体现。

Job 的状态查询

Job 对象提供了多个方法来查询协程的当前状态。

  • isActive: true 表示协程正在运行或可以运行。

  • isCompleted: true 表示协程已结束(无论成功、失败还是被取消)。

  • isCancelled: true 表示协程已被取消或因失败而正在取消中。

import com.m8test.script.GlobalVariables.* /* * 完整示例 6.1: 查询一个 Job 的生命周期状态 */ // --- 样板代码 --- _threads.getMain().setBackground(true) val scope = _coroutines.newScope(null) // 启动一个会运行一段时间的协程 // 修复:移除 lambda 参数 s ->,直接调用 delay val job = scope.launch(null, null) { delay(1000) } _console.log("任务刚启动:") _console.log(" - is active: " + job.isActive()) _console.log(" - is completed: " + job.isCompleted()) _console.log(" - is cancelled: " + job.isCancelled()) // 等待 500 毫秒,任务仍在运行中 scope.delay(500).then { s, _ -> _console.log("\n任务运行 500 毫秒后:") _console.log(" - is active: " + job.isActive()) _console.log(" - is completed: " + job.isCompleted()) _console.log(" - is cancelled: " + job.isCancelled()) job.toDeferred() }.then { s, _ -> _console.log("\n任务自然完成后:") _console.log(" - is active: " + job.isActive()) // 变为 false _console.log(" - is completed: " + job.isCompleted()) // 变为 true _console.log(" - is cancelled: " + job.isCancelled()) // 保持 false s.resolve(null) }
/* * 完整示例 6.1: 查询一个 Job 的生命周期状态 */ // --- 样板代码 --- $threads.getMain().setBackground(true) def scope = $coroutines.newScope(null) // 启动一个会运行一段时间的协程 def job = scope.launch(null, null, { s -> s.delay(1000) }) $console.log("任务刚启动:") $console.log(" - is active: " + job.isActive()) $console.log(" - is completed: " + job.isCompleted()) $console.log(" - is cancelled: " + job.isCancelled()) // 等待 500 毫秒,任务仍在运行中 scope.delay(500).then({ s, _ -> $console.log("\n任务运行 500 毫秒后:") $console.log(" - is active: " + job.isActive()) $console.log(" - is completed: " + job.isCompleted()) $console.log(" - is cancelled: " + job.isCancelled()) job.toDeferred() }).then({ s, _ -> $console.log("\n任务自然完成后:") $console.log(" - is active: " + job.isActive()) // 变为 false $console.log(" - is completed: " + job.isCompleted()) // 变为 true $console.log(" - is cancelled: " + job.isCancelled()) // 保持 false s.resolve(null) })
/* * 完整示例 6.1: 查询一个 Job 的生命周期状态 */ // --- 样板代码 --- $threads.getMain().setBackground(true); const scope = $coroutines.newScope(null); // 启动一个会运行一段时间的协程 const job = scope.launch(null, null, s => s.delay(1000)); $console.log("任务刚启动:"); $console.log(" - is active: " + job.isActive()); $console.log(" - is completed: " + job.isCompleted()); $console.log(" - is cancelled: " + job.isCancelled()); // 等待 500 毫秒,任务仍在运行中 scope.delay(500).then((s, _) => { $console.log("\n任务运行 500 毫秒后:"); $console.log(" - is active: " + job.isActive()); $console.log(" - is completed: " + job.isCompleted()); $console.log(" - is cancelled: " + job.isCancelled()); return job.toDeferred(); }).then((s, _) => { $console.log("\n任务自然完成后:"); $console.log(" - is active: " + job.isActive()); // 变为 false $console.log(" - is completed: " + job.isCompleted()); // 变为 true $console.log(" - is cancelled: " + job.isCancelled()); // 保持 false return s.resolve(null); });
--[[ * 完整示例 6.1: 查询一个 Job 的生命周期状态 ]] -- --- 样板代码 --- _threads:getMain():setBackground(true) local scope = _coroutines:newScope(nil) -- 启动一个会运行一段时间的协程 local job = scope:launch(nil, nil, function(s) return s:delay(1000) end) _console:log("任务刚启动:") _console:log(" - is active: " .. tostring(job:isActive())) _console:log(" - is completed: " .. tostring(job:isCompleted())) _console:log(" - is cancelled: " .. tostring(job:isCancelled())) -- 等待 500 毫秒,任务仍在运行中 scope:delay(500):_then(function(s, _) _console:log("\n任务运行 500 毫秒后:") _console:log(" - is active: " .. tostring(job:isActive())) _console:log(" - is completed: " .. tostring(job:isCompleted())) _console:log(" - is cancelled: " .. tostring(job:isCancelled())) return job:toDeferred() end):_then(function(s, _) _console:log("\n任务自然完成后:") _console:log(" - is active: " .. tostring(job:isActive())) -- 变为 false _console:log(" - is completed: " .. tostring(job:isCompleted())) -- 变为 true _console:log(" - is cancelled: " .. tostring(job:isCancelled())) -- 保持 false return s:resolve(nil) end)
<?php /** @var m8test_java\com\m8test\script\core\api\thread\Threads $threads */ global $threads; /** @var m8test_java\com\m8test\script\core\api\coroutines\Coroutines $coroutines */ global $coroutines; /** @var m8test_java\com\m8test\script\core\api\console\Console $console */ global $console; /* * 完整示例 6.1: 查询一个 Job 的生命周期状态 */ // --- 样板代码 --- $threads->getMain()->setBackground(true); $scope = $coroutines->newScope(function ($context) { $context->setDispatcher(function ($dispatchers) { return $dispatchers->getScriptMain(); }); }); // 启动一个会运行一段时间的协程 $job = $scope->launch(null, null, function ($s) { return $s->delay(1000); }); $console->log(javaString("任务刚启动:")); $console->log(javaString(" - is active: ") . ($job->isActive() ? 'true' : 'false')); $console->log(javaString(" - is completed: ") . ($job->isCompleted() ? 'true' : 'false')); $console->log(javaString(" - is cancelled: ") . ($job->isCancelled() ? 'true' : 'false')); // 等待 500 毫秒,任务仍在运行中 $scope->delay(500)->then(function ($s, $_) use ($job) { global $console; $console->log(javaString("\n任务运行 500 毫秒后:")); $console->log(javaString(" - is active: ") . ($job->isActive() ? 'true' : 'false')); $console->log(javaString(" - is completed: ") . ($job->isCompleted() ? 'true' : 'false')); $console->log(javaString(" - is cancelled: ") . ($job->isCancelled() ? 'true' : 'false')); return $job->toDeferred(); })->then(function ($s, $_) use ($job) { global $console; $console->log(javaString("\n任务自然完成后:")); $console->log(javaString(" - is active: ") . ($job->isActive() ? 'true' : 'false')); // 变为 false $console->log(javaString(" - is completed: ") . ($job->isCompleted() ? 'true' : 'false')); // 变为 true $console->log(javaString(" - is cancelled: ") . ($job->isCancelled() ? 'true' : 'false')); // 保持 false return $s->resolve(null); });
# # 完整示例 6.1: 查询一个 Job 的生命周期状态 # from m8test_java.com.m8test.script.GlobalVariables import _console from m8test_java.com.m8test.script.GlobalVariables import _coroutines # --- 样板代码 --- # 导入所需的全局变量 from m8test_java.com.m8test.script.GlobalVariables import _threads _threads.getMain().setBackground(True) scope = _coroutines.newScope(lambda it: it.setDispatcher(lambda d: d.getScriptMain())) # 启动一个会运行一段时间的协程 job = scope.launch(None, None, lambda s: s.delay(1000)) _console.log("任务刚启动:") _console.log(" - is active: " + str(job.isActive())) _console.log(" - is completed: " + str(job.isCompleted())) _console.log(" - is cancelled: " + str(job.isCancelled())) # 等待 500 毫秒,任务仍在运行中 scope.delay(500).then(lambda s, _: ( _console.log("\n任务运行 500 毫秒后:"), _console.log(" - is active: " + str(job.isActive())), _console.log(" - is completed: " + str(job.isCompleted())), _console.log(" - is cancelled: " + str(job.isCancelled())), job.toDeferred() )[-1]).then(lambda s, _: ( _console.log("\n任务自然完成后:"), _console.log(" - is active: " + str(job.isActive())), # 变为 false _console.log(" - is completed: " + str(job.isCompleted())), # 变为 true _console.log(" - is cancelled: " + str(job.isCancelled())), # 保持 false s.resolve(None) )[-1])
# encoding: utf-8 # # 完整示例 6.1: 查询一个 Job 的生命周期状态 # # --- 样板代码 --- $threads.getMain().setBackground(true) scope = $coroutines.newScope(nil) # 启动一个会运行一段时间的协程 job = scope.launch(nil, nil) { |s| s.delay(1000) } $console.log("任务刚启动:") $console.log(" - is active: " + job.isActive().to_s) $console.log(" - is completed: " + job.isCompleted().to_s) $console.log(" - is cancelled: " + job.isCancelled().to_s) # 等待 500 毫秒,任务仍在运行中 scope.delay(500).then do |s, _| $console.log("\n任务运行 500 毫秒后:") $console.log(" - is active: " + job.isActive().to_s) $console.log(" - is completed: " + job.isCompleted().to_s) $console.log(" - is cancelled: " + job.isCancelled().to_s) job.toDeferred() end.then do |s, _| $console.log("\n任务自然完成后:") $console.log(" - is active: " + job.isActive().to_s) # 变为 false $console.log(" - is completed: " + job.isCompleted().to_s) # 变为 true $console.log(" - is cancelled: " + job.isCancelled().to_s) # 保持 false s.resolve(nil) end

取消协程或作用域

取消是结构化并发的核心。您可以取消单个 Job,也可以取消整个 CoroutineScope,后者会取消作用域内所有活动的协程。

import com.m8test.script.GlobalVariables.* /* * 完整示例 6.2: 取消一个长时间运行的 Job */ // --- 样板代码 --- _threads.getMain().setBackground(true) val scope = _coroutines.newScope(null) // 修复:移除 lambda 参数 s -> val longRunningJob = scope.launch(null, null) { _console.log("一个需要5秒才能完成的漫长任务已启动...") delay(5000).then { s1, _ -> _console.log("任务完成, 这个任务被取消了,不应该执行") s1.resolve(null) } } // 在任务启动后,等待 2.5 秒然后取消它 scope.delay(2500).then { s, _ -> _console.log(" - is active: " + longRunningJob.isActive()) _console.log(" - is completed: " + longRunningJob.isCompleted()) _console.log(" - is cancelled: " + longRunningJob.isCancelled()) _console.log("\n发送取消信号给任务!") longRunningJob.cancel("用户请求超时。") // 检查取消后的状态 _console.log("任务取消信号已发送:") _console.log(" - is active: " + longRunningJob.isActive()) _console.log(" - is completed: " + longRunningJob.isCompleted()) // 可能还未完全完成 _console.log(" - is cancelled: " + longRunningJob.isCancelled()) // 变为 true s.resolve(null) }
/* * 完整示例 6.2: 取消一个长时间运行的 Job */ // --- 样板代码 --- $threads.getMain().setBackground(true) def scope = $coroutines.newScope(null) def longRunningJob = scope.launch(null, null, { s -> $console.log("一个需要5秒才能完成的漫长任务已启动...") s.delay(5000).then { s1 -> $console.log("任务完成, 这个任务被取消了,不应该执行") s1.resolve(null) } }) // 在任务启动后,等待 2.5 秒然后取消它 scope.delay(2500).then({ s, _ -> $console.log(" - is active: " + longRunningJob.isActive()) $console.log(" - is completed: " + longRunningJob.isCompleted()) $console.log(" - is cancelled: " + longRunningJob.isCancelled()) $console.log("\n发送取消信号给任务!") longRunningJob.cancel("用户请求超时。") // 检查取消后的状态 $console.log("任务取消信号已发送:") $console.log(" - is active: " + longRunningJob.isActive()) $console.log(" - is completed: " + longRunningJob.isCompleted()) // 可能还未完全完成 $console.log(" - is cancelled: " + longRunningJob.isCancelled()) // 变为 true s.resolve(null) })
/* * 完整示例 6.2: 取消一个长时间运行的 Job */ // --- 样板代码 --- $threads.getMain().setBackground(true); const scope = $coroutines.newScope(null); const longRunningJob = scope.launch(null, null, s => { $console.log("一个需要5秒才能完成的漫长任务已启动..."); s.delay(5000).then(s1 => { $console.log("任务完成, 这个任务被取消了,不应该执行"); return s1.resolve(null); }); }); // 在任务启动后,等待 2.5 秒然后取消它 scope.delay(2500).then((s, _) => { $console.log(" - is active: " + longRunningJob.isActive()); $console.log(" - is completed: " + longRunningJob.isCompleted()); $console.log(" - is cancelled: " + longRunningJob.isCancelled()); $console.log("\n发送取消信号给任务!"); longRunningJob.cancel("用户请求超时。"); // 检查取消后的状态 $console.log("任务取消信号已发送:"); $console.log(" - is active: " + longRunningJob.isActive()); $console.log(" - is completed: " + longRunningJob.isCompleted()); // 可能还未完全完成 $console.log(" - is cancelled: " + longRunningJob.isCancelled()); // 变为 true return s.resolve(null); });
--[[ * 完整示例 6.2: 取消一个长时间运行的 Job ]] -- --- 样板代码 --- _threads:getMain():setBackground(true) local scope = _coroutines:newScope(nil) local longRunningJob = scope:launch(nil, nil, function(s) _console:log("一个需要5秒才能完成的漫长任务已启动...") s:delay(5000):_then(function(s1) _console:log("任务完成, 这个任务被取消了,不应该执行") return s1:resolve(nil) end) end) -- 在任务启动后,等待 2.5 秒然后取消它 scope:delay(2500):_then(function(s, _) _console:log(" - is active: " .. tostring(longRunningJob:isActive())) _console:log(" - is completed: " .. tostring(longRunningJob:isCompleted())) _console:log(" - is cancelled: " .. tostring(longRunningJob:isCancelled())) _console:log("\n发送取消信号给任务!") longRunningJob:cancel("用户请求超时。") -- 检查取消后的状态 _console:log("任务取消信号已发送:") _console:log(" - is active: " .. tostring(longRunningJob:isActive())) _console:log(" - is completed: " .. tostring(longRunningJob:isCompleted())) -- 可能还未完全完成 _console:log(" - is cancelled: " .. tostring(longRunningJob:isCancelled())) -- 变为 true return s:resolve(nil) end)
<?php /** @var m8test_java\com\m8test\script\core\api\thread\Threads $threads */ global $threads; /** @var m8test_java\com\m8test\script\core\api\coroutines\Coroutines $coroutines */ global $coroutines; /** @var m8test_java\com\m8test\script\core\api\console\Console $console */ global $console; /* * 完整示例 6.2: 取消一个长时间运行的 Job */ // --- 样板代码 --- $threads->getMain()->setBackground(true); $scope = $coroutines->newScope(function ($context) { $context->setDispatcher(function ($dispatchers) { return $dispatchers->getScriptMain(); }); }); $longRunningJob = $scope->launch(null, null, function ($s) { global $console; $console->log(javaString("一个需要5秒才能完成的漫长任务已启动...")); $s->delay(5000)->then(function ($s1) { global $console; $console->log(javaString("任务完成, 这个任务被取消了,不应该执行")); return $s1->resolve(null); }); }); // 在任务启动后,等待 2.5 秒然后取消它 $scope->delay(2500)->then(function ($s, $_) use ($longRunningJob) { global $console; $console->log(javaString(" - is active: ") . ($longRunningJob->isActive() ? 'true' : 'false')); $console->log(javaString(" - is completed: ") . ($longRunningJob->isCompleted() ? 'true' : 'false')); $console->log(javaString(" - is cancelled: ") . ($longRunningJob->isCancelled() ? 'true' : 'false')); $console->log(javaString("\n发送取消信号给任务!")); $longRunningJob->cancel(javaString("用户请求超时。")); // 检查取消后的状态 $console->log(javaString("任务取消信号已发送:")); $console->log(javaString(" - is active: ") . ($longRunningJob->isActive() ? 'true' : 'false')); $console->log(javaString(" - is completed: ") . ($longRunningJob->isCompleted() ? 'true' : 'false')); // 可能还未完全完成 $console->log(javaString(" - is cancelled: ") . ($longRunningJob->isCancelled() ? 'true' : 'false')); // 变为 true return $s->resolve(null); });
# # 完整示例 6.2: 取消一个长时间运行的 Job # from m8test_java.com.m8test.script.GlobalVariables import _console from m8test_java.com.m8test.script.GlobalVariables import _coroutines # --- 样板代码 --- # 导入所需的全局变量 from m8test_java.com.m8test.script.GlobalVariables import _threads _threads.getMain().setBackground(True) scope = _coroutines.newScope(lambda it: it.setDispatcher(lambda d: d.getScriptMain())) longRunningJob = scope.launch(None, None, lambda s: ( _console.log("一个需要5秒才能完成的漫长任务已启动..."), s.delay(5000).then(lambda s1: ( _console.log("任务完成, 这个任务被取消了,不应该执行"), s1.resolve(None) )[-1]) )) # 在任务启动后,等待 2.5 秒然后取消它 scope.delay(2500).then(lambda s, _: ( _console.log(" - is active: " + str(longRunningJob.isActive())), _console.log(" - is completed: " + str(longRunningJob.isCompleted())), _console.log(" - is cancelled: " + str(longRunningJob.isCancelled())), _console.log("\n发送取消信号给任务!"), longRunningJob.cancel("用户请求超时。"), # 检查取消后的状态 _console.log("任务取消信号已发送:"), _console.log(" - is active: " + str(longRunningJob.isActive())), _console.log(" - is completed: " + str(longRunningJob.isCompleted())), # 可能还未完全完成 _console.log(" - is cancelled: " + str(longRunningJob.isCancelled())), # 变为 true s.resolve(None) )[-1])
# encoding: utf-8 # # 完整示例 6.2: 取消一个长时间运行的 Job # # --- 样板代码 --- $threads.getMain().setBackground(true) scope = $coroutines.newScope(nil) longRunningJob = scope.launch(nil, nil) do |s| $console.log("一个需要5秒才能完成的漫长任务已启动...") s.delay(5000).then do |s1| $console.log("任务完成, 这个任务被取消了,不应该执行") s1.resolve(nil) end end # 在任务启动后,等待 2.5 秒然后取消它 scope.delay(2500).then do |s, _| $console.log(" - is active: " + longRunningJob.isActive().to_s) $console.log(" - is completed: " + longRunningJob.isCompleted().to_s) $console.log(" - is cancelled: " + longRunningJob.isCancelled().to_s) $console.log("\n发送取消信号给任务!") longRunningJob.cancel("用户请求超时。") # 检查取消后的状态 $console.log("任务取消信号已发送:") $console.log(" - is active: " + longRunningJob.isActive().to_s) $console.log(" - is completed: " + longRunningJob.isCompleted().to_s) # 可能还未完全完成 $console.log(" - is cancelled: " + longRunningJob.isCancelled().to_s) # 变为 true s.resolve(nil) end

job.invokeOnCompletion: 注册完成回调

.onComplete() 是 Deferred 的便利方法,但更底层的 job.invokeOnCompletion 提供了更原始的能力:它会接收一个可空的 Throwable 参数,让你能精确地知道任务是如何结束的。

import com.m8test.script.GlobalVariables.* /* * 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态 */ // --- 样板代码 --- _threads.getMain().setBackground(true) val scope = _coroutines.newScope(null) val job = scope.delay(500).then { innerScope, _ -> if (Math.random() > 0.5) { innerScope.resolve("操作成功") } else { val err = _exceptions.newThrowable { setMessageAndClassName("模拟一个随机错误", null) } innerScope.reject(err) } } // 注册一个完成回调 job.invokeOnCompletion { error -> if (error == null) { _console.log("invokeOnCompletion: 任务成功完成!") } else { _console.error("invokeOnCompletion: 任务因异常而完成 -> " + error.getMessage()) } }
/* * 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态 */ // --- 样板代码 --- $threads.getMain().setBackground(true) def scope = $coroutines.newScope(null) def job = scope.delay(500).then({ innerScope, _ -> if (Math.random() > 0.5) { innerScope.resolve("操作成功") } else { def err = $exceptions.newThrowable({ it.setMessageAndClassName("模拟一个随机错误", null) }) innerScope.reject(err) } }) // 注册一个完成回调 job.invokeOnCompletion({ error -> if (error == null) { $console.log("invokeOnCompletion: 任务成功完成!") } else { $console.error("invokeOnCompletion: 任务因异常而完成 -> " + error.getMessage()) } })
/* * 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态 */ // --- 样板代码 --- $threads.getMain().setBackground(true); const scope = $coroutines.newScope(null); const job = scope.delay(500).then((innerScope, _) => { if (Math.random() > 0.5) { return innerScope.resolve("操作成功"); } else { const err = $exceptions.newThrowable(it => it.setMessageAndClassName("模拟一个随机错误", null)); return innerScope.reject(err); } }); // 注册一个完成回调 job.invokeOnCompletion(error => { if (error == null) { $console.log("invokeOnCompletion: 任务成功完成!"); } else { $console.error("invokeOnCompletion: 任务因异常而完成 -> " + error.getMessage()); } });
--[[ * 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态 ]] -- --- 样板代码 --- _threads:getMain():setBackground(true) local scope = _coroutines:newScope(nil) local job = scope:delay(500):_then(function(innerScope, _) if math.random() > 0.5 then return innerScope:resolve("操作成功") else local err = _exceptions:newThrowable(function(it) it:setMessageAndClassName("模拟一个随机错误", nil) end) return innerScope:reject(err) end end) -- 注册一个完成回调 job:invokeOnCompletion(function(error) if error == nil then _console:log("invokeOnCompletion: 任务成功完成!") else _console:error("invokeOnCompletion: 任务因异常而完成 -> " .. error:getMessage()) end end)
<?php /** @var m8test_java\com\m8test\script\core\api\thread\Threads $threads */ global $threads; /** @var m8test_java\com\m8test\script\core\api\coroutines\Coroutines $coroutines */ global $coroutines; /** @var m8test_java\com\m8test\script\core\api\console\Console $console */ global $console; /** @var m8test_java\com\m8test\script\core\api\exception\Exceptions $exceptions */ global $exceptions; /* * 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态 */ // --- 样板代码 --- $threads->getMain()->setBackground(true); $scope = $coroutines->newScope(function ($context) { $context->setDispatcher(function ($dispatchers) { return $dispatchers->getScriptMain(); }); }); $job = $scope->delay(500)->then(function ($innerScope, $_) { global $exceptions; if ((mt_rand() / mt_getrandmax()) > 0.5) { return $innerScope->resolve(javaString("操作成功")); } else { $err = $exceptions->newThrowable(function ($it) { $it->setMessageAndClassName(javaString("模拟一个随机错误"), null); }); return $innerScope->reject($err); } }); // 注册一个完成回调 $job->invokeOnCompletion(function ($error) { global $console; if ($error == null) { $console->log(javaString("invokeOnCompletion: 任务成功完成!")); } else { $console->error(javaString("invokeOnCompletion: 任务因异常而完成 -> ") . $error->getMessage()); } });
# 导入Python标准库 import random from m8test_java.com.m8test.script.GlobalVariables import _console from m8test_java.com.m8test.script.GlobalVariables import _coroutines from m8test_java.com.m8test.script.GlobalVariables import _exceptions # --- 样板代码 --- # 导入所需的全局变量 from m8test_java.com.m8test.script.GlobalVariables import _threads # # 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态 # _threads.getMain().setBackground(True) scope = _coroutines.newScope(lambda it: it.setDispatcher(lambda d: d.getScriptMain())) job = scope.delay(500).then(lambda innerScope, _: innerScope.resolve("操作成功") if random.random() > 0.5 else innerScope.reject(_exceptions.newThrowable( lambda it: it.setMessageAndClassName("模拟一个随机错误", None))) ) # 注册一个完成回调 job.invokeOnCompletion(lambda error: ( _console.log("invokeOnCompletion: 任务成功完成!") if error is None else _console.error("invokeOnCompletion: 任务因异常而完成 -> " + str(error.getMessage())) ))
# encoding: utf-8 # # 完整示例 6.3: 使用 invokeOnCompletion 监听 Job 的最终状态 # # --- 样板代码 --- $threads.getMain().setBackground(true) scope = $coroutines.newScope(nil) job = scope.delay(500).then do |innerScope, _| if Java::JavaLang::Math.random() > 0.5 innerScope.resolve("操作成功") else err = $exceptions.newThrowable { |it| it.setMessageAndClassName("模拟一个随机错误", nil) } innerScope.reject(err) end end # 注册一个完成回调 job.invokeOnCompletion do |error| if error == nil $console.log("invokeOnCompletion: 任务成功完成!") else $console.error("invokeOnCompletion: 任务因异常而完成 -> " + error.getMessage()) end end
09 December 2025