Membuat Synchronous Looping dengan While di Javascript
Mungkin ada beberapa kasus kita di paksa untuk menggunakan pemrosesan Synchronous dan looping di program javascript yang kita tulis. Seperti kasus saya yang ingin migrasi data dari Mysql ke Postgresql. Tapi untungnya saya menggunakan Prisma ORM yang sedikit mengurangi beban migrasi.
Kenapa kasus saya menggunakan Synchronous Looping dengan while ? karena sebelum nya saya menggunakan Mysql Planetscale yang di situ untuk relasi tidak bisa menggunakan standar relasi table SQL dan harus menggunakan index untuk relasi table. Untuk penjelasan tentang relasi table Mysql Planetscale dan Prisma bisa di baca di sini. Struktur dan relasi table di Postgresql ada perubahan juga dan membuat saya berfikir lagi. Dan akhirnya saya memiliki solusi, saya export data dari Mysql dan saya jadikan array JSON dan Import data ke Postgresql menggunakan Api (untungnya data belum mencapai belasan ribu row) dan Di sini masalahnya, karena di salah satu table ada perubahan relasi yang sebelumnya saya menggunakan relasi explicit many to many menjadi implicit many to many, dan harus saat import data, juga harus menghubungkan data dengan id yang sudah ada. Sayangnya untuk sekarang (April 2023), kasus saya sekarang tidak bisa menggunakan metode createMany() dari prisma dan otomatis, saya harus memasukan data satu persatu dengan menggunakan metode prisma create() dan Synchronous Looping dengan While. Sebelum masuk inti pembahasan, saya akan menjelaskan apa itu Synchronous dan Looping.
Synchronous (synchronus) adalah sebuah istilah dalam pemrograman yang mengacu pada alur eksekusi kode yang berjalan secara berurutan. Synchronuous berbeda dengan Asynchronous, jika Asynchronous metode pemrosesan data atau instruksi di dalam sebuah program yang memungkinkan program untuk mengeksekusi beberapa tugas atau operasi secara bersamaan.
Analogi dari penjelasan Synchronous dan Asynchronous, jika anda makan dalam sehari 3 kali, jika dengan analogi synchronus, anda akan makan di waktu pagi, siang dan sore. Kalau menggunakan analogi asynchronous, makan pagi, siang dan sore di lakukan di pagi hari dan setelah itu anda tidak makan lagi karena waktu anda makan di habiskan di pagi hari.
Looping atau perulangan adalah konstruksi dalam pemrograman yang memungkinkan untuk mengulang suatu blok kode secara berulang-ulang. Looping sangat berguna untuk mengeksekusi instruksi atau tugas yang sama berulang kali, tanpa harus menulis kode secara manual untuk setiap instruksi atau tugas tersebut. contoh looping jika meggnunakan javascript adalah for atau while.
Kenapa saya menggunakan while untuk looping, karena menurut saya, implementasi looping dan jika ingin menerapkan Synchronous lebih mudah dari pada menggunakan for .
Karena saya sebelumnya menjelaskan juga kalau saya menggunakan Prisma ORM, saya juga akan tulis schema prisma saya sebagai gambaran di sini untuk mempermudah penjelasan. Untuk schema prisma seperti di bawah:
// schema.prisma
model Post {
id Int @id @default(cuid())
title String
categories Category[]
}
model Category {
id Int @id @default(autoincrement())
name String
posts Post[]
}
Sesuai schema di atas, saya memiliki 2 table, pertama table Post dan yang kedua table Category. Untuk di kasus ini, table Category sudah memiliki data dan saya akan import data di table Post dan menghubungkan data Post dengan Category yang memiliki relasi many to many.
Untuk data yang saya akan import ke table Post akan dalam bentuk JSON. Untuk struktur data JSON nya seperti berikut:
// post-data.json
[
{
"id": "cdgwergasdfasdfasdf",
"title": "Post 1",
"categories": {
"connect": [
{
"id": 1,
},
{
"id": 2,
}
]
}
},
{
"id": "cdgwergasdfasdfa541234",
"title": "Post 2",
"categories": {
"connect": [
{
"id": 2,
}
]
}
},
...
]
Kenapa di dalam field categories terdapat field connect? karena itu sesuai dengan metode Prisma ORM jika ingin menghubungkan ke relasi table Categories berdasarkan id. untuk penjelasan lebih lanjut bisa baca di sini.
Di sini saya menggunakan Fastify Js, dan saya hanya akan menuliskan route nya saja untuk mempersingkat waktu dan di harapkan sebelum membaca tutorial ini, anda sudah memiliki pengalaman atau pengetahuan menggunakan Fastify Js atau Express Js dan jika ingin mempelajari tentang fastify route bisa baca di sini. Route dari fastify seperti dibawah:
function postHandler(request, reply){...}
server.post("/", postHandler);
Di code fastify di atas, ada function dengan nama postHandler dan tulis code di dalam function postHandler seperti berikut:
function postHandler(request, reply){
const body = request.body;
const savePostToPrisma = (data) => {
return new Promise(async (resolve, reject) => {
try{
const response = await prisma.post.create({
data: data,
select: {
id: true
}
});
resolve(response);
}catch(err){
reject(err);
}
});
}
let count = 0;
while (count < body.length) {
console.log(`Count: ${count}`);
await savePostToPrisma(body[count]);
count++;
}
}
Di code di atas, while akan menjalankan arrow function savePostToPrisma secara Synchronous dan memasukan data Post ke table Post prisma satu persatu.
Kunci dari Synchronous di looping while ini adalah di await. Saat arrow function savePostToPrisma di eksekusi di dalam while, maka while tidak akan melanjutkan perulangannya sampai ekseskusi di dalam arrow function savePostToPrisma selesai.
Semoga bermanfaat…