Rumah >hujung hadapan web >tutorial js >Cara menggunakan Promise.race untuk menambah tamat masa untuk mengambil panggilan

Cara menggunakan Promise.race untuk menambah tamat masa untuk mengambil panggilan

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-01 18:18:11360semak imbas

How to use Promise.race to add timeout to fetch calls

API pengambilan sangat berguna untuk membuat permintaan rangkaian, tetapi ia tidak disertakan dengan ciri tamat masa terbina dalam. Ini bermakna apl anda mungkin digantung selama-lamanya jika rangkaian perlahan atau pelayan tidak bertindak balas.

Nasib baik JavaScript ialah bahasa serba boleh, berpusat pada pengaturcaraan dipacu acara, menyediakan satu set fungsi utiliti yang dikumpulkan dalam objek Promise. Menggunakan kaedah Promise.race, kami boleh membuat mekanisme tamat masa untuk panggilan pengambilan kami. Dengan cara ini, kami boleh memastikan aplikasi kami responsif, walaupun perkara tidak berjalan seperti yang dirancang dengan rangkaian.

Jadi, saya akan membimbing anda tentang cara melaksanakan tamat masa ini menggunakan Promise.race. Kami akan mulakan dengan contoh pengambilan mudah dan kemudian meningkatkannya dengan menambahkan tamat masa. Saya juga akan berkongsi senario dunia sebenar di mana kami berurusan dengan token CSRF untuk menunjukkan kepada anda cara kaedah ini berfungsi dalam konteks yang selamat.

Anggap kita ada ini:

// Prepare fetch options
const options = {
    method: method,
    headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'X-CSRF-TOKEN': csrfToken
    },
    body: JSON.stringify({items})
};

// Make the fetch request
const response = await fetch(fetchUrl, options);

Jika kami ingin menambah mekanisme tamat masa untuk diambil, kami boleh membuat janji dengan tamat masa yang mencetuskan penolakan. Janji menggunakan Promise.race, untuk menjalankan pelbagai janji dan apabila seseorang selesai dengan penolakan atau azam, menghentikan semua yang lain.

// Timeout mechanism for fetch
const fetchWithTimeout = (url, options, timeout = 5000) => {
    return Promise.race([
        fetch(url, options),
        new Promise((_, reject) => setTimeout(() => reject(new Error('Request timed out')), timeout))
    ]);
};

// Make the fetch request
const response = await fetchWithTimeout(fetchUrl, options);

Berikut ialah contoh dunia sebenar dengan token CSRF

// Validate CSRF token
const csrfToken = document.querySelector('meta[name="csrf-token"]')?.content;
if (!csrfToken) {
    throw new Error('CSRF token not found in the document.');
}

// Prepare fetch options
const options = {
    method: method,
    headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'X-CSRF-TOKEN': csrfToken
    },
    body: JSON.stringify({items})
};

// Timeout mechanism for fetch
const fetchWithTimeout = (url, options, timeout = 5000) => {
    return Promise.race([
        fetch(url, options),
        new Promise((_, reject) => setTimeout(() => reject(new Error('Request timed out')), timeout))
    ]);
};

// Make the fetch request
const response = await fetchWithTimeout(fetchUrl, options);

Atas ialah kandungan terperinci Cara menggunakan Promise.race untuk menambah tamat masa untuk mengambil panggilan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn