Tetapkan batas waktu untuk ajax (jQuery)

194
$.ajax({
    url: "test.html",
    error: function(){
        //do something
    },
    success: function(){
        //do something
    }
});

Terkadang successfungsi bekerja dengan baik, terkadang tidak.

Bagaimana cara menetapkan batas waktu untuk permintaan ajax ini? Misalnya, 3 detik, jika waktu habis, maka tunjukkan kesalahan.

Masalahnya adalah, permintaan ajax membekukan blok sampai selesai. Jika server dimatikan sebentar, itu tidak akan pernah berakhir.

James
sumber
2
Anda perlu di ,sana setelah }.
pimvdb
1
kemungkinan duplikat dari jQuery $ .ajax timeout setting
nathanchere

Jawaban:

328

Silakan baca $.ajax dokumentasinya , ini adalah topik yang dibahas.

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

Anda dapat melihat jenis kesalahan apa yang dilemparkan dengan mengakses parameter textStatus dari error: function(jqXHR, textStatus, errorThrown)opsi. Opsinya adalah "batas waktu", "kesalahan", "batalkan", dan "parsererror".

Intelekshual
sumber
4
mengenai menangkap kesalahan batas waktu stackoverflow.com/questions/3543683/…
Adrien Be
1
Sepertinya tidak berfungsi untuk saya, batas waktu: 1, mengonfirmasikan sedang disahkan, tidak pernah habis
PandaWood
Pastikan untuk menutup seluruh panggilan $ .ajax dengan mencoba / menangkap. Aborsi tidak ditangkap oleh jQuery dan akan dilempar keluar dari panggilan $ .ajax.
justdan23
112

Berikut adalah beberapa contoh yang menunjukkan pengaturan dan mendeteksi batas waktu dalam paradigma lama dan baru jQuery.

Live Demo

Janji dengan jQuery 1.8+

Promise.resolve(
  $.ajax({
    url: '/getData',
    timeout:3000 //3 second timeout
  })
).then(function(){
  //do something
}).catch(function(e) {
  if(e.statusText == 'timeout')
  {     
    alert('Native Promise: Failed from timeout'); 
    //do something. Try again perhaps?
  }
});

jQuery 1.8+

$.ajax({
    url: '/getData',
    timeout:3000 //3 second timeout
}).done(function(){
    //do something
}).fail(function(jqXHR, textStatus){
    if(textStatus === 'timeout')
    {     
        alert('Failed from timeout'); 
        //do something. Try again perhaps?
    }
});​

jQuery <= 1.7.2

$.ajax({
    url: '/getData',
    error: function(jqXHR, textStatus){
        if(textStatus === 'timeout')
        {     
             alert('Failed from timeout');         
            //do something. Try again perhaps?
        }
    },
    success: function(){
        //do something
    },
    timeout:3000 //3 second timeout
});

Perhatikan bahwa param textStatus (atau jqXHR.statusText ) akan memberi tahu Anda apa kesalahannya. Ini mungkin berguna jika Anda ingin tahu bahwa kegagalan itu disebabkan oleh batas waktu.

kesalahan (jqXHR, textStatus, errorThrown)

Suatu fungsi untuk dipanggil jika permintaan gagal. Fungsi menerima tiga argumen: Objek jqXHR (dalam jQuery 1.4.x, XMLHttpRequest), string yang menjelaskan jenis kesalahan yang terjadi dan objek pengecualian opsional, jika ada. Nilai yang mungkin untuk argumen kedua (selain nol) adalah "batas waktu", "kesalahan", "batalkan", dan "pengurai". Ketika kesalahan HTTP terjadi, errorThrown menerima bagian tekstual dari status HTTP, seperti "Tidak Ditemukan" atau "Kesalahan Server Internal." Pada jQuery 1.5, pengaturan kesalahan dapat menerima berbagai fungsi. Setiap fungsi akan dipanggil secara bergantian. Catatan: Handler ini tidak dipanggil untuk skrip lintas-domain dan permintaan JSONP.

src: http://api.jquery.com/jQuery.ajax/

Brandon Boone
sumber
Apa perbedaan antara $.ajax().fail()dan $.ajax().error()?
Alejandro García Iglesias
1
@GarciaWebDev - Lihat Panggilan ke jquery ajax - .fail vs.: error
Brandon Boone
3
+1 untuk menyertakan jQuery 1.8+. Sebagian besar jawaban lain untuk pertanyaan serupa hanya menyertakan keberhasilan / kesalahan dari <.
naskah merek
22

Anda dapat menggunakan timeoutpengaturan di opsi ajax seperti ini:

$.ajax({
    url: "test.html",
    timeout: 3000,
    error: function(){
        //do something
    },
    success: function(){
        //do something
    }
});

Baca semua tentang opsi ajax di sini: http://api.jquery.com/jQuery.ajax/

Ingatlah bahwa ketika timeout terjadi, errorpawang dipicu dan bukan successpawang :)

Martin Jespersen
sumber
2

gunakan .ajaxfungsi jQuery berfitur lengkap . bandingkan dengan https://stackoverflow.com/a/3543713/1689451 sebagai contoh.

tanpa pengujian, cukup gabungkan kode Anda dengan pertanyaan SO yang dirujuk:

target = $(this).attr('data-target');

$.ajax({
    url: $(this).attr('href'),
    type: "GET",
    timeout: 2000,
    success: function(response) { $(target).modal({
        show: true
    }); },
    error: function(x, t, m) {
        if(t==="timeout") {
            alert("got timeout");
        } else {
            alert(t);
        }
    }
});​
Rudolf Mühlbauer
sumber
H-Bahrami dan Rudolf Mühlbauer terima kasih atas balasan tetapi saya baru di ajax jadi tolong jelaskan melalui kode saya ... karena saya sudah melihat jawaban ini tetapi saya tidak tahu Apa yang terjadi .. tolong bantu saya ...
bagaimana saya bisa melakukannya melalui .load ()? Apakah mungkin atau tidak?
@ SS, coba cari batas waktu dalam dokumentasi memuat: api.jquery.com/load - dan saya salah ketik di kode saya, diperbaiki.
Rudolf Mühlbauer