新規投稿
フォローする

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) {
var record = event.record;
return new kintone.Promise(function(resolve, reject) {
var fields = ['*ここに商品名を記載*',...];
var tableValue = [];
for (var i = 0; i < fields.length; i++) {
if (record[fields[i] + '数量'].value) {
tableValue.push({
'value': {
'*サブテーブル商品名のフィールドコード*': {
'value': fields[i]
},
'*サブテーブル数量のフィールドコード*': {
'value': record[fields[i] + '数量'].value
}
}
});
}
};
var body = {
'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を除いたら動かなかったので、処理に必要なことはわかるのですが、何をしているのかわからないので教えていただきたいです。

0

2件のコメント

Avatar
岡崎 光輝

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

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));
});

});
})();
岡崎 光輝により編集されました
0
Avatar
岡崎 光輝

追記:

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

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));
});

});
})();
岡崎 光輝により編集されました
0
サインインしてコメントを残してください。