Membuat Javascript Promise Timeout dengan Promise.race

1 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Promise Timeout dengan Promise.race
Photo by Austris Augusts on Unsplash

TeknoCerdas.com – Salam cerdas untuk kita semua. Pada Javascript, selain callback cara untuk menuliskan kode asynchronus adalah dengan menggunakan Promise. Namun tetap ada kekurangan pada promise adalah masalah timeout. Tidak ada cara baku dan API standar untuk memaksa sebuah promise timeout setelah beberapa waktu.

Sebagai contoh, kita menggunakan sebuah pustaka pihak ketiga yang mengembalikan Promise. Pustaka tersebut tidak memiliki mekanisme timeout. Lalu bagaimana menghentikannya setelah sekian waktu

Salah satu solusi untuk menambahkan timeout pada Promise adalah dengan menggunakan method Promise.race(). Method tersebut menerima argumen berupa array of promise. Jika salah satu Promise dalam daftar tersebut sudah selesai atau mengembalikan error maka Promise tersebut akan dikembalikan.

Baca Juga
Menambah Fitur Manual Preview pada HTML Editor

Berbekal konsep tersebut kita dapat memasukkan sebuah timeout dalam Promise dan menjalankannya bersamaan dengan Promise utama didalam Promise.race().

Contoh Kode Promise.race()

Kita akan mensimulasikan sebuah promise yang memakan waktu sangat lama untuk selesai. Nilai balik diperlukan dalam 3 detik sehingga sistem tidak idle dalam waktu yang lama.

// Simulate long running process that takes forever
const veryLongLongTask = new Promise(function(resolve, reject) {
    setTimeout(function() {
        resolve('Task completed.');
    }, 60000);
});

// Timeout set for 3 seconds
const timeoutForTask = new Promise(function(resolve, reject) {
    setTimeout(function() {
        reject('Task timeout.');
    }, 3000);
});

Promise.race([veryLongLongTask, timeoutForTask])
    .then(function(response) {
        console.log('Completed =>', response);
    })
    .catch(function(err) {
        console.log('Something went wrong =>', err);
    });
Something went wrong => Task timeout.

Dapat terlihat jika Promise timeoutForTask dieksekusi oleh Promise.race sehingga menyebabkan timeout pada task yang panjang dan tidak selesai.

Referensi lanjutan yang bagus dapat membaca sumber di MDN.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race