services 拡張機能を使用して、Stingray エディタ用の新しい JavaScript サービスを登録することができます。
これらのサービスは一度インスタンス化され、Stingray セッション全体で「web worker」として使用できます。カスタム JavaScript サービスの API はプラグイン内の他の場所から、または他のプラグインから呼び出すことができます。-- Stingray エディタに組み込まれた JavaScript サービスで関数を呼び出す場合と方法はまったく同じです。(サービスの使用方法の詳細については、「組み込みのエディタ サービスを使用する」を参照してください)。
たとえば、カスタム メニュー アクションや、カスタム パネルに関連付けられている JavaScript モジュールからカスタム サービスの API 関数を呼び出すことができます。このサービスの 1 つのインスタンスがそれを必要とするすべてのパネルによって共有されるため、複数のパネルで状態の情報を共有する必要がある場合に便利です。
サービス拡張機能ごとに、次の環境設定パラメータが必要です。
extensions = { services = [ { name = "my-custom-service" module = "my-module-file.js" api = [ "get_greeting" "print_message" ] } ] }
name
これはサービス モジュールの名前で、require および define 呼び出しで表示される必要があります。
module
api キーによってリストされている API 関数を含む JavaScript モジュールです。このパスは、.stingray_plugin ファイルの場所に対する相対パスです。
api
この配列は、サービスの module ファイルによって公開されているすべての関数の名前をリストする必要があります。エディタで新しいサービスが作成および登録された場合、新しいサービスの非同期 API を介してこれらの各関数が公開されます。
次の Javascript ブロックが my-module-file.js というファイルに保存されている場合、上記の環境設定で指定された API が実装されます。
以下のモジュールで公開されている関数の名前が、上記のサービス拡張機能の定義内にある api キーで定義された名前と一致していることにご注意ください。
define([], function () { "use strict"; function MyService() { this.get_greeting = function () { return "Hello world!"; }; this.alert_message = function (message) { alert(message); }; }; return new MyService(); });
サービスが登録され、その API 関数が宣言されると、別の JavaScript モジュールまたはアクション内で新しいサービスを要求することで、これらの関数にアクセスできます。たとえば、次のスニペットを実行すると、新しいメニュー項目が設定され、そのアクションをトリガしたときにカスタム サービスの API が呼び出されるようになります。
extensions = { menus = [ { path = "Window/Print info" action = { type = "js" script = """ require(['services/my-custom-service'], function (myCustomService) { myCustomService.get_greeting().then(function(greeting) { console.warn(greeting); }). then( function() { myCustomService.print_message("it's a fine day.") } ) }); """ } } ] }
注意点:
環境設定内の module 設定は、エディタがサービスに公開する API 関数が含まれる実際の JavaScript ファイルを指します。
ただし、上記のブロック内のように require または define 呼び出しでサービスを参照する場合、services/ の前に name 設定を使用します。
サービス内の関数は、非同期 API 内で自動的にラップされています。関数がシンプルで簡単な同期コードである場合も、サービスを介して呼び出すときは、その戻り値は promise 内で自動的にラップされます。したがって、組み込み Stingray サービスなど、非同期的にアクセスできるように準備する必要があります。上記の例では、then() を使用して、複数の呼び出しが確実に順番に行われるように、これらを連結します。「組み込みのエディタ サービスを使用する」および「プラグインの開発に関するヒント」も参照してください。
サービスは、自己完結型のウィンドウなしのコンテキストで実行されます。つまり、API の関数は、この情報を渡さない限り、ウィンドウまたはドキュメントに直接アクセスできないことを意味します。