ServiceNow の GlideAjax を用いてサーバー側のデータを取得する際、getXML() と getXMLWait() の選択はユーザー体験(UX)に決定的な影響を与えます。ここでは、これら2つのメソッドの核心的な違いと、それぞれの正しい使い分けやベストプラクティスを整理します。
1. getXML()(非同期: Asynchronous)
ServiceNowが最も推奨する標準のベストプラクティスです。サーバーへリクエストを飛ばした後、レスポンスを待たずに即座に後続のスクリプトを実行するため、ユーザーは画面操作を快適に続けることができます。
- UI の応答性: 非常に高い。バックグラウンドで処理が進行するため、画面がフリーズ(操作不能)になりません。
- 主な用途: 参照フィールド入力に伴う他フィールドの自動セットや、動的な参照データの取得など、UIを止めるべきではない処理。
✅ 実装例 (onChange Script):
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') return;
var ga = new GlideAjax('UserInfoAjax');
ga.addParam('sysparm_name', 'getUserPhone');
ga.addParam('sysparm_user_id', newValue);
// コールバック関数を使用して非同期で処理(フリーズしない)
ga.getXML(function(response) {
var phoneNumber = response.responseXML.documentElement.getAttribute("answer");
g_form.setValue('caller_phone', phoneNumber);
});
}
2. getXMLWait()(同期: Synchronous)
サーバーからの応答が返ってくるまで、ブラウザ側(JavaScript)での後続処理を一切停止し、画面を強制的に待機状態(フリーズ)にさせます。
- UI のフリーズ: 確実に発生します。ネットワーク側が遅いとユーザーに「システムが固まった」とストレスを与える原因になります。
- 主な用途:
onSubmitスクリプト等での必須チェックなど、「サーバーからの確認結果を待たなければ、絶対にその先のステップ(送信)へ進ませてはいけない」という極めて限定的なケースでのみ使用します。 - ⚠ 制限事項: スコープ対象のアプリケーション(Scoped Applications)や Service Portal 環境ではサポートされていない(動作しない)ため、使用を避ける必要があります。
✅ 実装例 (onSubmit Script):
function onSubmit() {
var ga = new GlideAjax('UserValidator');
ga.addParam('sysparm_name', 'validateUser');
// サーバーの応答が返るまでここで処理を完全に停止する(UIフリーズ発生)
ga.getXMLWait();
var result = ga.getAnswer();
if (result !== 'true') {
g_form.addErrorMessage("送信権限がないためブロックしました。");
return false; // 送信を中止
}
return true;
}
💡 補足:getXMLAnswer() の活用によるコードの簡略化
複雑なXMLノードを解析する必要がなく、サーバー側から単純な文字列(値)のみを取得する場合は、getXML() の代わりに getXMLAnswer() を使用することを強く推奨します。 これを利用すると、response.responseXML.documentElement... という冗長なコードを省き、コールバック処理を非常に簡潔に記述することができます。
✅ 実装例 (getXMLAnswer を使ったスッキリとしたコード):
// 変数answerの中に、サーバーから返された実際の値が直接入ります
ga.getXMLAnswer(function(answer) {
if (answer) {
g_form.setValue('caller_phone', answer);
}
});
トラブルシューティングと注意点
- Script Include の設定: GlideAjaxを呼び出す先のサーバー側スクリプト(Script Include)は、必ず「Client callable」のチェックボックスにチェックを入れる必要があります。これを忘れると通信エラーになります。
まとめ
- 快適な操作性を損なわないために、基本的には常に
getXML()やgetXMLAnswer()による非同期通信を標準として開発しましょう getXMLWait()は画面をフリーズさせる重大なデメリットがあるため、「送信前(onSubmit)の最終チェック」など必要不可欠な場面にだけに限定してください- Scoped App や Service Portal 環境ではそもそも同期処理(Wait)が制限されている点に注意が必要です
一言まとめ: 👉 快適な操作性を実現するために getXML() を標準とし、単一値の取得なら getXMLAnswer() を使ってスッキリ書こう!