kintone apiを使って、データを登録したところ
レコード番号の並びが思うようでありません。
情報をお持ちの方が居られましたら、ご教示をお願いします。
【環境】
言語:javascript
Api :‘/k/v1/record’
【処理概要】
1.単純ループを設定
2.(ループ内で)JSONデータ作成
3.(ループ内で)'/k/v1/record’を使用してレコード作成
4.ループ終了
【現象】
レコード番号がプログラムからの出力順と異なる
出力順 レコード番号
1 1
2 3
3 2
【考察】
JSONによる情報通信は、非同期を基本としているため
jsからのデータ送信(登録リクエスト含め)実行順は
保証されないと予測。
【対策】
JSONリクエスト(‘/k/v1/record’)の戻りを待ち合わせて
次のレコードを処理する制御に切り替える。
※この手立てが分からないで困っています。
ヒント、助言などでも構いませんので情報提供をお願いします。
佐藤健一 様
ラジカルブリッジの斎藤です。
文面から、kintone.api()
https://developers.cybozu.com/ja/kintone-api/appapi-requestjsapi.html#REST_API
を使用して、1件ずつレコード登録されているものと推察されますが、kintone.api()は非同期処理であるため、順序が保証されていないと思われます。
同じkintone.api()でも1件ずつ登録するのではなく、レコードの一括登録のやり方で登録してみるというのはいかがでしょうか?
https://developers.cybozu.com/ja/kintone-api/apprec-createapi.html#i
「リクエストの records パラメータで指定した順番でレコードを登録します。」
と書いてますので、その一括登録の中では順序が保証されると思います。
ただ、この一括登録は最大100レコードまでしか登録できませんので、それを超える場合は複数回に分けて登録になるため同じような問題に直面するかと思います。
その場合はkintone標準の非同期メソッドであるkintone.api()ではなく、XMLHttpRequestを使った同期通信で実装する方法があります。
これであれば1件ずつでも100件ずつでも、順番に処理されます。
以下、XMLHttpRequest使用時の1件登録時のサンプルコードです。
(paramに登録するJSONデータが格納されているものとします)
※一括登録の場合は1行目の’/k/v1/records’にして、適切なJSONを構築してください。
var appUrl = kintone.api.url(‘/k/v1/record’);
// CSRFトークンの取得
var token = kintone.getRequestToken();
param[" REQUEST_TOKEN"] = token;
// 同期リクエストを行う
var xmlHttp = new XMLHttpRequest();
xmlHttp.open(‘POST’, appUrl, false);
xmlHttp.setRequestHeader(‘Content-Type’, ‘application/json’);
xmlHttp.setRequestHeader(‘X-Requested-With’,‘XMLHttpRequest’);
xmlHttp.send(JSON.stringify(param));
if (xmlHttp.status == 200){
var obj = JSON.parse(xmlHttp.responseText);
(登録成功後の処理)
} else {
alert(xmlHttp.status + ‘:登録エラー’);
}
XMLHttpRequestを使ったPOST処理時の注意点は、こちらもご参照ください。
https://cybozudev.zendesk.com/hc/ja/articles/201732180-CSRF%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%88%A9%E7%94%A8%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9
ラジカルブリッジ 斎藤様
懇切丁寧なご説明、ありがとうございます。
大変参考になりました。
ヒントに留まらず、サンプルソースのご提示まで頂き、
なんとお礼を申し上げて宜しいか
恐縮でございます。
ありがとうございました。
Yusuke Amano 様
I/Fのご紹介、ありがとうございます。
100件一括登録も検討したのですが
業務都合で1件登録で実装するという
方針のため、選択肢から外していました。
ありがとうございました。
jQuery.Deferredを使えば順番に処理を行うことができます。
http://api.jquery.com/category/deferred-object/
サンプル
※jQueryをincludeする必要があります。
var register = function(record) {
var d = new $.Deferred;
kintone.api(‘/k/v1/record’, ‘POST’, {app: kintone.app.getId(), record: record}, function(resp) {
d.resolve();
});
return d.promise();
};
var record1 = {text1:{value:‘foo’}};
var record2 = {text1:{value:‘bar’}};
var record3 = {text1:{value:‘baz’}};
register(record1).then(function() {
return register(record2);
}).then(function() {
return register(record3);
});
門屋 亮 様
jQuery.Deferredのご紹介、ありがとうございます。
解決策の一つとして、検討したいと思います。
どうもありがとうございました。
細谷です。
いつも参考にさせて頂いております。
ありがとうございます。
param[“REQUESTTOKEN”] = token;
これ「REQUESTTOKEN」の前後にアンダーバー( _ )が2つずつはいるんですね^^;
投稿するとアンダーバーが消えて太文字になってしまうみたいですね^^;
これで私の場合はうまく動きました!
いつも参考にさせて頂きありがとうございます。
これ「REQUESTTOKEN」の前後にアンダーバー( _ )が2つずつはいるんですね^^;
投稿するとアンダーバーが消えて太文字になってしまうみたいですね^^;
Markdown記法が効いちゃっていたようですね。。
失礼いたしました。