promiseを使った在庫更新で検索後の更新APIが非同期で動いているようです

見よう見まねでJavascriptを使ったkintoneのカスタマイズを行っています、

ごく普通の在庫更新だと思いますが、出庫伝票の登録成功時に、その商品を在庫アプリから検索して、現在在庫から出庫数を引き去るようなカスタマイズを行っています。

当初作成したJavascriptだと非同期で処理されるので正しく更新されないことがあり、「kintoneにおけるPromiseの書き方の基本」を参考にして同期処理に書き直しました。

出庫伝票には複数の商品を入力できるので、検索で商品の在庫データを一括取得し、それを一括更新するようにしています。更新後に「完了しました」のアラートを表示します。

下記に一部省略したコーディングを示しますが、更新後のアラートが表示されません。ただしいつもではなく、商品が1件の場合は表示され、3件以上の場合は表示されたりされなかったりします。ちょうど非同期で動いていた時と同様です。コンソールを見ると、アラートが表示されない場合は詳細画面へのNavigateが表示されています。

しかし、商品在庫自体は正しく更新されています(もっと件数が多いとどうなるかわかりませんが)。

以下、問題の関数です。

/**********************************************************************
* 出庫伝票の登録成功時に、出庫伝票に入力された商品を商品在庫アプリから
* 検索し、各商品の現在の在庫数から出庫数を減じて商品在庫を一括更新する
* 出庫伝票のレコード追加画面の保存成功後のイベント
* ‘app.record.create.submit.success’ から呼び出される関数である
***********************************************************************/
function zaikoKensakuKousin(event) {
   console.log(“zaikoKensaku Start”);
  /* 出庫伝票のeventより入力された商品番号を取得し、商品在庫検索のqueryを        parmに作成する。(省略)*/
  // 在庫検索のREST APを実行
  return kintone.api(url, ‘GET’, parm).then(function(resp){
     //正常時の処理
    console.log(“在庫検索OK”);
    /*検索結果から商品在庫の現在在庫数-出庫伝票の出庫数を計算し、更新用
のparmを作成する。(省略)*/
   // 在庫更新のREST APを実行 //promiseを返す
  return kintone.api(url, ‘PUT’, parm);
}).then(function(resp2){
  //正常時の処理
  console.log(“在庫更新OK”);     
  alert(“完了しました。”);
  return event;

  }).catch(function(resperr){
  //エラー発生時の処理
  console.log(“エラー発生”);
  event.error = resperr.messagel  
  return event;
});

}

どこが間違っているのかわかりません。何かヒントはありませんでしょうか。

 

真木さん

Promise 処理で、うまくいかないという場合は下記の条件に外れている場合が多いと思います。

・kintone.Promiseオブジェクトをreturnすると、非同期処理の実行を待つことができます。

たぶん今回の場合は、zaikoKensakuKousin 関数の呼び出し方が下記になっていないと思います。

return zaikoKensakuKousin(event);

あとエラー時の処理ですが、‘app.record.create.submit.success’ は、レコード更新後のイベントなので、

event.error を指定してもレコード更新をキャンセル出来ませんし、エラーも表示されません。

こちらも alert でエラー表示が必要です。

rex0220さん

ありがとうございます!

なるほど、REST APIの部分だけを見ていて、その関数全体もPromiseとしてReturnしないといけないところを失念にておりました。

ご指摘のように修正したところ、期待通りの動きになりました。

トラブルと視野が小さくなってしまいます。いったん引いて全体を見ないといけませんね。

エラー処理の件も確かにその通りです。検討します。