PreScript で callAPI の実行結果を元にエラー処理する場合の実現方法

@hx-support @iwasaki.hexabase

PreScriptでcallAPIの実行結果を元にエラー処理を実装したいのですが、実現方法がわからず苦戦しています。

callAPIの実行結果を元にエラー処理を実装したい

上記を実現可能な方法があれば教えていただきたいです。
よろしくお願いいたします。

★実現したいこと
指定グループ内にすでに存在するメールアドレスの場合はPreScriptでエラー発生させてスクリプト停止したい。(callAPIの実行結果を元にエラー判定したい)

★PreScript エラー処理で参考にした開発ガイド

@hi-takahashi
こちら、調査の上回答させていただきます。
どうぞよろしくお願い致します。

1 Like

@hx-support @iwasaki.hexabase
へキサベースさんの方でこれから確認いただく

★ヘキサベースさんから聞いている状況
・関連事象を確認済み。(callAPI コールバック内でログ出力されない)

★自分の想定(思い当たること)
・callAPI 非同期処理結果を待たずにタスク(キュー)みたいに積まれてる?
・スクリプト終わった後にコールバックが処理されていて、スクリプト終わった時点でログ出力されてない?
・↑の通り処理順が問題の場合は、await callAPI とか非同期処理結果を待てるようにしたり、非同期処理後にスクリプト処理が動くようになれば解消される?

・エラーに関してはコールバック内のエラーがスクリプトに届いてないのかも(コールバック内エラーthrowがcatchされない)
・↑のとおりならコールバック内のエラーをcatchできるようになれば行けそう

1 Like

@hi-takahashi

本件の解決策として、ActionScriptからPromiseを返却する形で実装できるよう改善対応を実施しております。多少仕様が変わる可能性はありますが、正式にはリリース時にご案内いたします。
例えば、ActionScriptへの登録例として、以下のような形で実装できるようになる予定です。

(async function(data) {
    return new Promise((resolve, reject) => {

        const appId = "TestApp";
        const datastoreId = "TODO-SAMPLE"
    
        logger.log("Process starting...")
    
        // first call
        const url = `api/v0/applications/${appId}/datastores/${datastoreId}/items/search`;
        const payload = {
            use_display_id: true,
            omit_fields_data: true,
            conditions: [],
            per_page: 1,
            page: 1
        }
        callAPIAsync('POST', url, payload).then(res => {
            logger.log("Proc1 Called")

            // next call
            const url = `api/v0/applications/${appId}/datastores/${datastoreId}/items/search`;
            const payload = {
                use_display_id: true,
                omit_fields_data: true,
                conditions: [],
                per_page: 1,
                page: 1
            } 
            return callAPIAsync('POST', url, payload)  // you can return promise
        }).then(res => {
            logger.log("Proc2 Called")

            // call resolve() if you want to proceed
            resolve(); 

        }).catch(e => {
            logger.error("ERR !!")

            // call reject() if you want to stop action execution
            reject({
                 "result":  "Stopped", 
                 "error" : "error messages"
            });  // result object will be returned to Hexabase's API result 
        });    

    });
})

rejectして、Action実行を停止した場合は、以下のように結果が返る方向で開発を進めております。

{
    "details": {
        "logs": [
            "Process starting...",
            "Proc1 Called",
            "Proc2 Called",
        ],
        "result": {
            "error": "error messages",
            "result": "Stopped"
        },
        "status": "REJECTED",
        "stop_execution": true
    },
    "error": ""
}
1 Like

@hx-support @iwasaki.hexabase

早急にご対応いただきありがとうございました!

ドキュメント等に使い方が見当たらなかったのですが、どこかに記載されていますでしょうか?
以下返信の通りの使い方で問題ないでしょうか?(callAPIAsyncを使う)

ActionScriptの使い方については、下記を参照してください。

基本操作

保存と読み込み

CLIによるログ出力

CLIツールの基本操作 | Hexabase 開発ガイド

@y.kachi

ご回答ありがとうございます。
以下リリース内容を参考に確認いたします。