Promiseの処理順について

https://developer.cybozu.io/hc/ja/community/posts/4404708498201-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E5%88%A5%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%B5%E3%83%96%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E4%BF%9D%E5%AD%98

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

以前投稿した質問(上記url)で回答いただいたコード(下記コード)について、

最初のkintone.Promiseがどうして必要なのかが理解できず、ご教授いただきたいです。

素人考えですと、基本コードは上から処理されるため、

var bodyまで上から順に処理されて、kintone.api()のところでreturnして、処理はthenで繋げば問題がないように感じます。

(function() {
'use strict';
kintone.events.on([
'app.record.create.submit','app.record.edit.submit'
],function(event) {
varrecord = event.record;
returnnewkintone.Promise(function(resolve, reject) {
varfields = ['\*ここに商品名を記載\*',...];
vartableValue = [];
for(vari =0; i < fields.length; i++) {
if(record[fields[i] +'数量'].value) {
tableValue.push({
'value': {
'\*サブテーブル商品名のフィールドコード\*': {
'value': fields[i]
},
'\*サブテーブル数量のフィールドコード\*': {
'value': record[fields[i] +'数量'].value
}
}
});
}
};
varbody = {
'app': *対象のアプリid*,
'record': {
'\*サブテーブルのフィールドコード\*': {
'value': tableValue
},
//その他のフィールドをPOSTに含めるのであれば続けて記載'
},
};
if(tableValue.length >0) {
kintone.api(kintone.api.url('/k/v1/record',true),'POST', body,function(resp) {
resolve(event);
},function(error) {
alert(JSON.stringify(error));
resolve(event);
});
}else{
resolve(event);
}
});
});
})();

 

しかし、kintone.Promiseを除いたら動かなかったので、処理に必要なことはわかるのですが、何をしているのかわからないので教えていただきたいです。

はじめまして。
まず本件についての解決策から。

create.submitやedit.submitイベント時にkintone.api()をreturnすると、
apiの処理を待って保存をしてくれるという性質をkintoneは持っております。
そのため今回のような最後にpost処理をして、保存をするといったプログラムでは、
kintone.Promiseを使わなくても解決できるということになります。
最後にプログラムを添付しておきますね。

では、どのような場合にkintone.Promiseを使いたいかということになりますが、
同じようにcreate.submitイベントで考えてみます。
レコードにほかの複数のアプリ情報を記録したいとき、
kintone.api()でほかの複数アプリ情報を取得→event.recordに代入→return event
とありますが、kintone.api()をreturnすると他アプリの情報を取ってきた時点で、
処理完了となってしまい、レコードに取得してきた情報を記録する前に保存が完了されます。
その際に、kintone.Promiseで任意のタイミングを待って処理完了をすることができるようになります。(実際にこの例もkintone.Promiseを使わなくても問題ありませんが。。書き方によっては分かりやすいです。kintoneのapiの環境が優れていることがわかります。。)

詳しくはこちらで公式に解説されております。
kintone.Promiseとは

以下ソース

(function() {
'use strict';
kintone.events.on([
'app.record.create.submit', 'app.record.edit.submit'
], function(event) {

const record = event.record;
const fields = ['*ここに商品名を記載*'];
const tableValue = [];

for (let i = 0; i < fields.length; i++) {
if (record[fields[i] + '数量'].value) {
tableValue.push({
'value': {
'*サブテーブル商品名のフィールドコード*': {
'value': fields[i]
},
'*サブテーブル数量のフィールドコード*': {
'value': record[fields[i] + '数量'].value
}
}
});
}
};

//ココの時点でtableValueに何もなければプログラムを終了
if (tableValue.length == 0) return;

var body = {
'app': 123 /* 対象のアプリid */ ,
'record': {
'*サブテーブルのフィールドコード*': {
'value': tableValue
},
//その他のフィールドをPOSTに含めるのであれば続けて記載'
},
};


return kintone.api(kintone.api.url('/k/v1/record', true), 'POST', body).then(function(resp) {
//success
console.log(resp);
}, function(error) {
//error
console.error(JSON.stringify(error));
});

});
})();

追記:

恐らく以下でも同じように動きます。

const,letを使い、reduceというjsメソッド(標準機能)を利用して簡潔にしました。
varの宣言とconst,letの宣言方法の違いはお調べ下さい。

(function() {
'use strict';
kintone.events.on([
'app.record.create.submit', 'app.record.edit.submit'
], function(event) {

const record = event.record;
const fields = ['*ここに商品名を記載*'];

const tableValue = fields.reduce((acc, fieldCode) => {
if (record[`${fieldCode}数量`].value) {
acc.push({
'value': {
'*サブテーブル商品名のフィールドコード*': {
'value': fieldCode
},
'*サブテーブル数量のフィールドコード*': {
'value': record[`${fieldCode}数量`].value
}
}
})
}
return acc;
}, []);

//ココの時点でtableValueに何もなければプログラムを終了
if (tableValue.length === 0) return;

var body = {
'app': 123 /* 対象のアプリid */ ,
'record': {
'*サブテーブルのフィールドコード*': {
'value': tableValue
},
//その他のフィールドをPOSTに含めるのであれば続けて記載'
},
};


return kintone.api(kintone.api.url('/k/v1/record', true), 'POST', body).then(function(resp) {
//success
console.log(resp);
}, function(error) {
//error
console.error(JSON.stringify(error));
});

});
})();

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