JXA - 如果应用程序未运行则抛出异常(涉及竞争条件)

时间:2017-03-28 01:20:07

标签: macos applescript

背景信息:我为tmux创建了一个小状态栏,显示iTunes中的一些信息(歌曲播放,艺术家,玩家位置等)。它是通过shell调用(在我的例子中是zsh)$(osascript -l JavaScript script_file)来完成的。我遇到的问题是应用程序对象上方法调用的默认行为:如果应用程序关闭,任何调用都会打开应用程序。

这对我来说是一个问题因为,因为tmux状态栏每秒更新一次,如果应用程序在检查完运行后关闭,但是在调用之前,它会重新打开,这是一个巨大的痛苦,如果我想关闭该应用程序。

示例代码:

1  itunes = Application('iTunes')
2  
3  if (itunes.running()) {
4    return itunesStatusLine()
5  } else {
6    return '---'
7  }

您可以看到if和return之间的竞争条件。

我考虑过的事情:

  1. 关闭前分离所有tmux会话。手动操作很麻烦,但是可编写脚本,它完全避免了这个问题。然而,这是一种解决方法,而不是解决方案。
  2. 从iTunes预先获取所有必要的数据,将每个调用包装在自己的if-else块中,将数据传递给状态行函数,并在一个失败时抛出异常。这并没有解决问题,但它可能会通过更早地失败并且(希望)更快来缓解它。 (虽然保持了我的理智。我想进一步扩展这个东西,并且在每个电话周围放置相同的try-catch块听起来很麻烦。)
  3. 减慢tmux状态栏更新速度。再次,解决方法,而不是解决方案,它将有点射击脚的代码的可用性。在状态行上进行1秒更新并不常见(使用秒钟的时钟会浮现在脑海中)。
  4. 我认为理想的解决方案是使用方法调用,如果应用程序关闭而不是打开应用程序,则会引发异常。如果有任何办法与JXA做这样的事情,我不知所措。我已经对文档进行了筛选(脚本编辑器库中的内容以及我可以在网上找到的剪贴簿内容)并且显示为空。

1 个答案:

答案 0 :(得分:0)

我不确定你到底在想什么,但我有:

/**
 * Checks to see if an app is running.
 *
 * @param appName   -   Text containing the Application ID, Application Name or Process Name of the application.
 * @return          -   True if the app is running, false if the app is not running.
 */
function isAppRunning(appName) {
    try {
        return Application(appName).running();
    } catch (e) {
        return false;
    }
}

这对我有用,不会导致应用启动。如果不存在此类应用程序,则只返回false(未运行)。