# Một bài toán xử lý bất đồng bộ trong kintone để lấy số requet quá giới hạn (OK)

**Bài toán được đặt ra**: Mỗi lần Request Tối đa của kintone chỉ được 500 records; vậy nếu trong bảng có khoảng 800 dòng dữ liệu vậy phải làm gì để có thể đọc hết được 🤣🤣🤣&#x20;

**Lời giải**: Chúng ta dùng cơ chế bất đồng bộ cộng thêm với hàm Đệ quy (hàm lồng trong)

![](/files/z3q4OITz4DGRnsLjKuvj)

![](/files/MLK7GdYB6i2hjPGv0tWd)

![](/files/cVgZ58eLabysLDs6vuGS)

```
// == console.log(resp); Fech Lần 1 được 2 kết quả.
{
	"records": [{
		"水槽": {
			"type": "SINGLE_LINE_TEXT",
			"value": "テスト水槽"
		},
		"更新者": {
			"type": "MODIFIER",
			"value": {
				"code": "t.pham@tiahgroup.com",
				"name": "Tuong"
			}
		},
		"作成者": {
			"type": "CREATOR",
			"value": {
				"code": "t.pham@tiahgroup.com",
				"name": "Tuong"
			}
		},
		"魚種": {
			"type": "DROP_DOWN",
			"value": "トラフグ"
		},
		"ロット日付": {
			"type": "DATE",
			"value": "2022-02-16"
		},
		"原価": {
			"type": "NUMBER",
			"value": "1"
		},
		"出荷済み原価": {
			"type": "NUMBER",
			"value": "1"
		},
		"選別元ID": {
			"type": "RECORD_NUMBER",
			"value": "6"
		},
		"$revision": {
			"type": "__REVISION__",
			"value": "7"
		},
		"更新日時": {
			"type": "UPDATED_TIME",
			"value": "2022-03-18T04:35:00Z"
		},
		"選別日": {
			"type": "DATE",
			"value": "2022-02-18"
		},
		"斃死数": {
			"type": "NUMBER",
			"value": "1"
		},
		"終了フラグ": {
			"type": "CHECK_BOX",
			"value": []
		},
		"作業者1": {
			"type": "SINGLE_LINE_TEXT",
			"value": "河原　邦正"
		},
		"出荷数": {
			"type": "NUMBER",
			"value": "1"
		},
		"ロットID": {
			"type": "NUMBER",
			"value": ""
		},
		"尾数": {
			"type": "NUMBER",
			"value": "1"
		},
		"水槽ID": {
			"type": "NUMBER",
			"value": "1"
		},
		"作成日時": {
			"type": "CREATED_TIME",
			"value": "2022-03-18T04:27:00Z"
		},
		"棟": {
			"type": "SINGLE_LINE_TEXT",
			"value": "A"
		},
		"$id": {
			"type": "__ID__",
			"value": "6"
		}
	}, {
		"水槽": {
			"type": "SINGLE_LINE_TEXT",
			"value": "テスト水槽"
		},
		"更新者": {
			"type": "MODIFIER",
			"value": {
				"code": "t.pham@tiahgroup.com",
				"name": "Tuong"
			}
		},
		"作成者": {
			"type": "CREATOR",
			"value": {
				"code": "t.pham@tiahgroup.com",
				"name": "Tuong"
			}
		},
		"魚種": {
			"type": "DROP_DOWN",
			"value": "トラフグ"
		},
		"ロット日付": {
			"type": "DATE",
			"value": "2022-02-10"
		},
		"原価": {
			"type": "NUMBER",
			"value": "0"
		},
		"出荷済み原価": {
			"type": "NUMBER",
			"value": ""
		},
		"選別元ID": {
			"type": "RECORD_NUMBER",
			"value": "5"
		},
		"$revision": {
			"type": "__REVISION__",
			"value": "6"
		},
		"更新日時": {
			"type": "UPDATED_TIME",
			"value": "2022-03-18T04:26:00Z"
		},
		"選別日": {
			"type": "DATE",
			"value": "2022-02-14"
		},
		"斃死数": {
			"type": "NUMBER",
			"value": ""
		},
		"終了フラグ": {
			"type": "CHECK_BOX",
			"value": []
		},
		"作業者1": {
			"type": "SINGLE_LINE_TEXT",
			"value": "河原　邦正"
		},
		"出荷数": {
			"type": "NUMBER",
			"value": ""
		},
		"ロットID": {
			"type": "NUMBER",
			"value": "1"
		},
		"尾数": {
			"type": "NUMBER",
			"value": "12"
		},
		"水槽ID": {
			"type": "NUMBER",
			"value": "1"
		},
		"作成日時": {
			"type": "CREATED_TIME",
			"value": "2022-02-21T07:41:00Z"
		},
		"棟": {
			"type": "SINGLE_LINE_TEXT",
			"value": "A"
		},
		"$id": {
			"type": "__ID__",
			"value": "5"
		}
	}],
	"totalCount": null
}
// == console.log(resp); Fech Lần 2 được 1 kết quả.
{
	"records": [{
		"水槽": {
			"type": "SINGLE_LINE_TEXT",
			"value": ""
		},
		"更新者": {
			"type": "MODIFIER",
			"value": {
				"code": "yamashita",
				"name": "山下"
			}
		},
		"作成者": {
			"type": "CREATOR",
			"value": {
				"code": "yamashita",
				"name": "山下"
			}
		},
		"魚種": {
			"type": "DROP_DOWN",
			"value": "トラフグ"
		},
		"ロット日付": {
			"type": "DATE",
			"value": "2022-02-10"
		},
		"原価": {
			"type": "NUMBER",
			"value": ""
		},
		"出荷済み原価": {
			"type": "NUMBER",
			"value": ""
		},
		"選別元ID": {
			"type": "RECORD_NUMBER",
			"value": "1"
		},
		"$revision": {
			"type": "__REVISION__",
			"value": "1"
		},
		"更新日時": {
			"type": "UPDATED_TIME",
			"value": "2022-02-10T02:28:00Z"
		},
		"選別日": {
			"type": "DATE",
			"value": "2022-02-10"
		},
		"斃死数": {
			"type": "NUMBER",
			"value": ""
		},
		"終了フラグ": {
			"type": "CHECK_BOX",
			"value": []
		},
		"作業者1": {
			"type": "SINGLE_LINE_TEXT",
			"value": ""
		},
		"出荷数": {
			"type": "NUMBER",
			"value": ""
		},
		"ロットID": {
			"type": "NUMBER",
			"value": "1"
		},
		"尾数": {
			"type": "NUMBER",
			"value": "100"
		},
		"水槽ID": {
			"type": "NUMBER",
			"value": ""
		},
		"作成日時": {
			"type": "CREATED_TIME",
			"value": "2022-02-10T02:28:00Z"
		},
		"棟": {
			"type": "SINGLE_LINE_TEXT",
			"value": "A"
		},
		"$id": {
			"type": "__ID__",
			"value": "1"
		}
	}],
	"totalCount": null
}
```

**Code xử lý**

```
function fetch(app_id, opt_query, opt_offset, opt_records) {
		var offset = opt_offset || 0;
		var records = opt_records || [];
		var query = opt_query || '';
		var id = app_id || kintone.app.getId();
		var params = {
			app: id,
			query: query + ' limit 2 offset ' + offset
		};
		return kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
			console.log(resp);
			records = records.concat(resp.records);
			if (resp.records.length === 2) {
				return fetch(id, query, offset + 2, records);
			}
			return records;
		});
	}
```

Toàn bộ code: <https://gbalb-demo.cybozu.com/k/admin/app/3412/plugin/config?pluginId=fdeplpmkengkldpdlaiegpokgmaabkkb>

```
(function() {
	"use strict";

	function fetch(app_id, opt_query, opt_offset, opt_records) {
		var offset = opt_offset || 0;
		var records = opt_records || [];
		var query = opt_query || '';
		var id = app_id || kintone.app.getId();
		var params = {
			app: id,
			query: query + ' limit 2 offset ' + offset
		};
		return kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
			console.log(resp);
			records = records.concat(resp.records);
			if (resp.records.length === 2) {
				return fetch(id, query, offset + 2, records);
			}
			return records;
		});
	}
	const appGetData = 3411;
	kintone.events.on(['app.record.create.show', 'app.record.edit.show', ], function(event) {
		if (document.getElementById('button-get') != null) {
			return;
		}
		var button = document.createElement('button');
		button.id = "button-get";
		button.className = "gaia-ui-actionmenu-save";
		button.innerHTML = '清算作成';
		var all = document.getElementsByClassName("gaia-ui-actionmenu-save");
		button.onclick = async function() {
			var tedestatement = [];
			var obj = kintone.app.record.get();
			var d = new Date(obj.record.給餌日.value);
			var day = d.getDate();
			var new_day = day - 50;
			d.setDate(new_day);
			var datap = moment(d).format('YYYY-MM-DD');
			const resp = await fetch(appGetData, 'ロット日付 > "' + String(datap) + '" and ロット日付 <= "' + String(obj.record.給餌日.value) + '" and 棟 = "' + obj.record.棟.value + '" and 終了フラグ not in ("終了") ').then(function(records) {
				return records;
			});
			resp.forEach(function(rcord, index) {
				var {
					水槽: { value: 水槽 },
					更新者: { value: 更新者 },
					作成者: { value: 作成者 },
					魚種: { value: 魚種 },
					ロット日付: { value: ロット日付 },
					原価: { value: 原価 },
					尾数: { value: 尾数 },
					出荷済み原価: { value: 出荷済み原価 },
					選別元ID: { value: 選別元ID },
					更新日時: { value: 更新日時 },
					選別日: { value: 選別日 },
					斃死数: { value: 斃死数 },
					終了フラグ: { value: 終了フラグ },
					出荷数: { value: 出荷数 },
					ロットID: { value: ロットID },
					作成日時: { value: 作成日時 },
					棟: { value: 棟 },
					$id: { value: $id }
				} = rcord;
				tedestatement.push({
					"value": {
						"水槽": {
							"type": "SINGLE_LINE_TEXT",
							"value": 水槽
						},
						"水槽ID": {
							"type": "NUMBER",
							"value": undefined
						},
						"魚種": {
							"type": "SINGLE_LINE_TEXT",
							"value": 魚種
						},
						"ロット日付": {
							"type": "DATE",
							"value": ロット日付
						},
						"尾数": {
							"type": "NUMBER",
							"value": 尾数
						},
						"数量": {
							"type": "NUMBER",
							"value": undefined
						},
						"単価": {
							"type": "NUMBER",
							"value": undefined
						},
						"金額": {
							"type": "CALC",
							"value": undefined
						},
						"餌ID": {
							"type": "NUMBER",
							"value": undefined
						},
						"選別ID": {
							"type": "NUMBER",
							"value": 選別元ID
						},
						"ロットID": {
							"type": "NUMBER",
							"value": ロットID
						},
						"餌": {
							"type": "SINGLE_LINE_TEXT",
							"value": ""
						}
					},
				});
			});
			obj.record.給餌テーブル.value = tedestatement;
			kintone.app.record.set(obj);
		}
		kintone.app.record.getSpaceElement('space').appendChild(button);
	});
	kintone.events.on(["app.record.create.submit.success", "app.record.edit.submit.success"], function(event) {
		const record = event.record;
		var table = record.給餌テーブル.value;
		var bodyPut = {
			app: appGetData,
			records: []
		};
		table.forEach(function(element) {
			if (element.value.選別ID.value) {
				let item = {
					id: element.value.選別ID.value,
					record: {
						原価: { value: element.value.金額.value }
					}
				};
				bodyPut.records.push(item);
			}
		});
		kintone.api(kintone.api.url('/k/v1/records.json', true), 'PUT', bodyPut, function(resp) {
			// success
		}, function(error) {
			// error
			console.log(error);
		});
	});
})();
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://javascriptuse.gitbook.io/javascript/mot-bai-toan-xu-ly-bat-dong-bo-trong-kintone-de-lay-so-requet-qua-gioi-han-ok.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
