2017-03-28 3 views
1

컨텍스트 : tmux의 상태 표시 줄에 iTunes의 일부 정보 (노래 재생, 아티스트, 플레이어 위치 등)를 표시했습니다. 그것은 쉘 (내 경우에는 zsh) $(osascript -l JavaScript script_file)을 통해 호출하여 수행합니다. 내가 겪었던 문제는 응용 프로그램 개체에 대한 메서드 호출의 기본 동작과 관련이 있습니다. 응용 프로그램이 닫히면 모든 호출이 응용 프로그램을 엽니 다.JXA - 응용 프로그램이 실행되지 않는 경우 예외 발생 (경쟁 조건 포함)

이것은 tmux 상태 표시 줄이 1 초에 한 번 업데이트되므로 실행 중인지 확인한 후 응용 프로그램이 닫히면 호출이 만들어지기 전에 열립니다. 다시 열면 엄청난 고통입니다. 내가 응용 프로그램을 닫고 싶다면.

예제 코드 :

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

당신은 경우와 수익 사이의 경쟁 조건을 볼 수 있습니다. 닫기 전에 모든 TMUX 세션을 분리

  1. :

    나는 생각했습니다 무엇

    . 이 작업은 수동으로 수행해야하지만 스크립트가 가능하므로 문제가 발생하지 않습니다. 그러나 해결책이 아닌 해결 방법입니다.

  2. iTunes에서 모든 필요한 데이터를 가져 와서 모든 호출을 자체 if-else 블록으로 래핑하고 데이터를 상태 표시 줄 함수에 전달한 다음 실패 할 경우 예외를 throw합니다. 이것은 문제를 해결하지는 못하지만 더 빠르거나 빨리 (희망을 갖고) 실패함으로써 그것을 완화 할 수 있습니다. (내 마음을 유지하는 동안,이 일을 더 확장하고, 모든 호출 주위에 동일한 try-catch 블록을 두는 것이 지저분 해 보인다.)
  3. tmux 상태 표시 줄을 느리게 실행한다. 다시 말하지만 솔루션이 아닌 해결 방법을 사용하면 코드의 코드 공유가 가능합니다. 상태 표시 줄에 1 초의 업데이트가있는 것은 흔하지 않습니다 (초를 사용하는 시계가 마음에 듭니다).

나는 응용 프로그램을 여는 대신 응용 프로그램을 닫으면 예외가 발생하는 메서드 호출을 사용하는 것이 이상적이라고 생각합니다. JXA에서 그런 일을 할 수있는 방법이 있다면, 저는 당황합니다. 필자는 문서 (Script Editor 라이브러리에있는 내용과 온라인에서 찾을 수있는 스크랩)를 살펴보고 비어 있습니다.

답변

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 (실행 중이 아님) 만 반환합니다.