一覧へ戻る
ITSM

ServiceNow における getXML() と getXMLWait() の使い分け

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() を使ってスッキリ書こう!