reloadのタイミング

お世話になっております。
以下のことを実現したいのですがうまくいきません。
お知恵をお貸しください。

1.外部システムから取得した伝票Noを、REST APIの「レコードを更新(PUT)」で更新する
2.REST APIの「レコードのステータス更新」でステータスを完了にする
3.画面上のフィールドに伝票Noを表示させる かつ、画面上のステータスを完了にする

以下のソースを書いていますが、エラー「{“code”:“CB_NO02”,“id”:“1505999166-1141162356”,“message”:“権限がありません。”}」となります。
画面を再読み込みすると、ステータスは完了になっておりますが、伝票Noは画面に反映されていません。

****ソース****
kintone.events.on(‘app.record.detail.show’, function (event) {
var record = event.record;

//伝票登録ボタンを設置
var touroku = document.createElement(‘button’);
touroku.id = ‘touroku_button’;
touroku.innerHTML = ‘仕訳伝票登録’;
touroku.onclick = function () {
//(中略) 外部システムに伝票を登録処理
.then(function (args) {
var res = JSON.parse(args[0]);

//外部システムへの登録結果から伝票番号を取得してレコードにセット
var denpNo = res.BusinessEntityResultOfBEInputSlip.Target.InputSlipHeader.Number;
if (denpNo != “”) {
window.alert(“伝票登録処理が完了しました。伝票番号は” + denpNo + “です。”); //BP①
var body =
{
app: kintone.app.getId(),
id: kintone.app.record.getId(),
record: {
伝票番号: {
value: denpNo
}
}
};
kintone.api(‘/k/v1/record’, ‘PUT’, body).then(function (response) { //BP②
location.reload(); //BP⑤
});
}

// ステータスを完了にする
//window.alert(“ステータスを完了にします”); //このアラートを有効にすると、エラーは起きない
var statusBody = {
“app”: kintone.app.getId(),
“id”: kintone.app.record.getId(),
“action”: “第2承認”,
};

kintone.api(‘/k/v1/record/status’, ‘PUT’, statusBody).then(function (resp) { //BP③
//location.reload(); ここにreloadをもってくると、エラーは起きないが伝票場号フィールドに値がセットされない
console.log(resp); //BP⑥
});

}) //BP④
.then(function (args) {
return event;
})
.catch(function (args) {
//エラー処理
return event;
});

}
kintone.app.record.getSpaceElement(‘touroku’).appendChild(touroku);
})

 

*********

<分かっている事>

・ブレークポイント(BP)を置いて追ってみると①〜⑥の順で動作しており、求める結果が得られるが、ブレークポイントを外すとエラーとなる。

・window.alert(“ステータスを完了にします”); のアラートを有効にするとエラーは起きず、求める結果が得られます(最後にリロードされ、ステータス・伝票NO共に画面に更新されている)

・location.reload(); をステータス更新APIの後に持ってくると、エラーは起きずリロードされましたが、ステータスのみ更新されており伝票番号フィールドには値がセットされない

 

一つの処理(REST API)が戻ってくるタイミングとリロードのタイミングでエラーが起きたり起きなかったりしているようなのですが、原因と解決方法が分からない状況です。アドバイスお願いします。

柳さん

ざっとみたところ、レコード更新API とステータス変更APIが、それぞれ同時に実行されます。
.then を並べるかネストするかして、下記の順番で実行されるようにするとうまくいくと思います。

・外部システムに伝票を登録
・レコード更新API
・ステータス変更API
・リロード

リロードは、必ず最後に実行するようにしないと、API処理中に画面遷移してしまいます。

※すみません、ボタンクリック処理なので、return event は不要でした。

 

rex0220さん

返信遅くなり大変失礼しました。

ご助言ありがとうございます。

.thenでつなげるようにしたら、うまくいきました!

ありがとうございました。