【发布时间】:2020-10-27 19:33:40
【问题描述】:
我正在尝试使用 JXA 来自动化 iTerm。
我想在第一个选项卡的“监视模式”下编译一些 UI 代码。 第一次编译库后(并创建 dist/ 文件夹),我想要第二个选项卡打开并运行一些其他代码,这些代码取决于第一个选项卡的输出。换句话说,我需要第二个选项卡等待第一个选项卡完成。
就 iTerm 的 JXA 自动化而言,我找不到任何方法让一个选项卡等待另一个选项卡。
我发现的每个示例都涉及打开多个选项卡并在这些选项卡中启动并行进程。
我能想到的最好的方法是使用某种形式的 setInterval 并检查 iTerm 的 session.isProcessing(我通过 Script Editor > Window > Library 在文档中找到),但即使这样也只会给出一些奇怪的错误,好像 isProcessing 不是应该阅读:
Error: Can't convert types
function timer(repeats, func, delay) {
const args = Array.prototype.slice.call(arguments, 2, -1);
args.unshift(this);
const boundFunc = func.bind.apply(func, args);
const operation = $.NSBlockOperation.blockOperationWithBlock(boundFunc);
const timer = $.NSTimer.timerWithTimeIntervalTargetSelectorUserInfoRepeats(
delay / 1000, operation, 'main', null, repeats
);
$.NSRunLoop.currentRunLoop.addTimerForMode(timer, "timer");
return timer;
}
function invalidate(timeoutID) {
timeoutID.invalidate
}
const setTimeout = timer.bind(undefined, false)
const setInterval = timer.bind(undefined, true)
const clearTimeout = invalidate
const clearInterval = invalidate
const terminal = Application('iTerm')
terminal.includeStandardAdditions = true
const window = terminal.currentWindow()
let tab = window.currentTab()
let session = tab.currentSession();
setInterval(function() {
console.log('isProcessing', session.isProcessing);
}, 500);
session.write({ text: 'ng build my-angular-lib --watch' });
//WAIT HERE
let tab2 = window.createTabWithDefaultProfile();
let session2 = tab2.currentSession();
session2.write({ text: 'npm link my-angular-lib && ng serve' });
【问题讨论】:
-
我可能错了,但是您是否考虑过引入资源锁的概念来帮助您解决这种情况?
-
我是 JXA 的新手,我不知道这样的事情。
-
我也不知道。也许你可以探索Mutex-Promise,直到你得到更有意义的东西。