promiseの中でif分を使う場合の書き方について

お世話になっております。

promiseを使って順番に処理させたいものがあります。

下記のresp1で条件に合えば再度promiseを待つような処理をしたいのですが、条件に合わなければpromiseを返さずにresp2に進んでしまうと思います。

promiseを返さなくてもthenでつなげてしまって良いのか、それとももっと適切な書き方があるようでしたらご教示いただけませんでしょうか。

(() => {

    'use strict';

    kintone.events.on('app.record.create.submit', (event) => {

        const record = event.record;

        record.合計.value = 0;

        // 商品アプリからデータ(レコードID: 1) を取得する

        return kintone.api(kintone.api.url('/k/v1/record', true), 'GET', {app: 1, id: 1}).then((resp1) => {

            if ( resp1.record.価格.value ) {

                // 取得したデータを合計して見積もりアプリに代入

                record.合計.value += Number(resp1.record.価格.value);

                // 商品アプリからデータ(レコードID: 2) を取得する

                return kintone.api(kintone.api.url('/k/v1/record', true), 'GET', {app: 1, id: 2});

            }

        }).then((resp2) => {

            if (resp2.record.length > 0) {

                // 取得したデータを合計して見積もりアプリに代入

                record.合計.value += Number(resp2.record.価格.value);

            }

            return event;

        });

    });

})();

mackey様

if分岐の是非というよりは「何を返すか」というとらえ方でも良いように思います.
例えば,resp1の結果によって分岐するのであれば,true/falseで返すものを変えるという手があるかと思います.

            if ( resp1.record.価格.value ) {
                // 取得したデータを合計して見積もりアプリに代入
                record.合計.value += Number(resp1.record.価格.value);
                // 商品アプリからデータ(レコードID: 2) を取得する
                return kintone.api(kintone.api.url('/k/v1/record', true), 'GET', {app: 1, id: 2});
          }else{
        return {record: []};
}

上記はresp1のif分岐にelseを加えて,falseの際に空のrecordを返しています.
これなら,提示いただいたコードをほぼ変えずに済みます.

スタイリッシュであったり,スマートな記述はそれはそれで素敵なのですが,
自分以外の人が関与する可能性を考えると,可読性も重要と思うので,
mackey様の書き方でも特別問題はないかと思います.
(if分岐があると,変数/配列の行方が追いやすいので)

なお,kintoneのapiを使うなら,kintone/rest-api-clientというものもあって,
これだとasync/await処理がしやすくて,チェーンにしなくて済むので使いかたによってはpromiseよりも楽かもしれません.

(() => {
  'use strict';

    kintone.events.on('app.record.create.submit', async (event) => {

      //api-clientの宣言
    const client = new KintoneRestAPIClient();

      const record = event.record;

      record.合計.value = 0;

      // 商品アプリからデータ(レコードID: 1) を取得する
    const resp1 = await client.record.getRecord({app: 1, id: 1});

      if(resp1.record.価格.value){

        // 商品アプリからデータ(レコードID: 2) を取得する
      const resp2 = await client.record.getRecord({app: 1, id: 2});

        if (resp2.record.length > 0) {

          // 取得したデータを合計して見積もりアプリに代入
        record.合計.value += Number(resp2.record.価格.value);

        }
    }
    return event;
  });
})();

参考:
kintone JavaScript Client (@kintone/rest-api-client)

参考になれば幸いです.

TO様

大変わかりやすい回答をありがとうございます!

回答をいただいていたのにご返信が遅くなってしまい申し訳ございませんでした。

 

true/falseで返すものを変えるという考え方で進めた方が他の人が見てもわかりやすくて良いですね。

そしてkintone/rest-api-clientについて教えていただきありがとうございます!

これを使って書いたコードはさらにわかりやすいのでpromiseよりもこの方法とasync/await処理での書き方に慣れていけるようにしたいと思います。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。