質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

uncaught(in promise) Objectエラーについて

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 3,476

saito3

score 9

 前提・実現したいこと

javascriptでKINTONEというシステムのチェック機能を作ってます。
ほぼほぼやりたいことはソースコードで書けたのですが、謎のエラーが出て困ってます。

 発生している問題・エラーメッセージ

uncaught(in promise) Object

 該当のソースコード

kintone.events.on(submit, event=>{
try {
            check2(event);
            check3(event);
            check4(event);
            check5(event);
            check6(event);
        } catch (e) {
            // e {
            //     code:    エラー部分のフィールドコード
            //     mainTxt: フィールドコードのエラーに入れるテキスト 
            //     subTxt:  eventオブジェクトのエラーに入れるテキスト
            // }; 
            var fCode = e.code;
            record[fCode]['error'] = e.mainTxt;
            event.error = e.subTxt;
            return event;
        }
});
async function check6(event){
        let query       = kintone.app.getQueryCondition();
        let record      = event.record;
        let records     = await fetchRecordsFunc(thisAppId, query);
        var start       = record.案件開始日.value;
        var end         = record.案件終了日.value;   
        var startDate   = new Date(start);      
        var endDate     = new Date(end);
        var errObj = new Object();
        console.log(records);
        /////////////////////////////////////////////////////////
        //ここのfor分で題名の謎のエラーが出ます。
        /////////////////////////////////////////////////////////
        for(var i=1 ; i < records.length ; i++){
            if(records[i].$id.value == record.$id.value) continue;//同レコードの場合スキップ

            if(records[i].エンジニアID.value == record.エンジニアID.value){
                let end2 = records[i].案件終了日.value;
                let end2Date = new Date(end2);
                console.log(startDate.getTime());
                console.log(end2Date.getTime());

                if(startDate.getTime() < end2Date.getTime()){
                    errObj.code     = "案件開始日";
                    errObj.mainTxt  = "案件期間が被ってます。";
                    errObj.subTxt   = "案件開始日";
                    throw errObj;
                }
            }
        }
    }
    /**
     * kintoneと通信を行うクラス(check-6で使用)
     */
    function fetchRecordsFunc (appId, optQuery, optOffset, optRecords) {
        let limit      = xxx;
        let query      = optQuery   || ""; 
        let offset     = optOffset  || 0;
        let allRecords = optRecords || [];

        // query += 'order by asc limit ' + limit + ' offset ' + offset;
        query += 'limit ' + limit + ' offset ' + offset;

        let params = {
            "app"   : appId, 
            "query" : query
        };

        return kintone.api('/k/v1/records', 'GET', params).then( resp => {
            allRecords = allRecords.concat(resp.records);
            if (resp.records.length === limit) {
                return fetchRecordsFunc(appId, optQuery, offset + limit, allRecords);
            }
            return allRecords;
        });
    }   

 試したこと


オブジェクトの宣言を、
errObj = {};
から
errObj = new Object();
に変更。


for分でエラーオブジェクトに値を入れたらbreakさせてthrow。

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

質問文にあるコードでは非同期関数check6()で発生した例外をキャッチすることができないため当該のエラーメッセージが発生しているものと思われます。

uncaught(in promise)というエラーメッセージは、Promiseオブジェクトが担っている処理において発生した例外がキャッチされなかった場合に発生します。
今回の場合、check6()async functionとして定義されているためcheck6()の返り値がPromiseオブジェクトとなります。
コードの最初のほうにあるtryの中でcheck6()を呼び出していますが、非同期関数の本体は実行せずにPromiseオブジェクトを生成するだけで素通りしてしまうのでここで非同期関数内の例外が発生することはありません。非同期関数の本体はtryの外で実行されることになります。

解決方法としては以下のいずれかが考えられます。

  • try句の中で非同期関数の実行を待つ
// `await`は非同期関数の中でしか使えません
kintone.events.on(submit, async event => {
    try {
        // ...
        await check6(event);
    } catch (e) {
        // ...
    }
});
  • Promiseオブジェクトの.catch()メソッドを使う
check6().catch(errObj => {
    // ...
});
  • check6()async functionではなくfunctionにする

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/15 18:02

    1つ目の対処方法で解決できました!
    ありがとうございます!

    キャンセル

0

let records     = await fetchRecordsFunc(thisAppId, query);

スマホで斜め読みなので間違えてたらゴメンナサイ。
thisAppIdて値入ってます?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/15 17:30 編集

    あ、これはグローバル変数なので、その部分は消して載せてます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る