2012-09-07 74 views
1

我打算打電話給ajax功能,並正在通過api查看。我很好奇,如果有一個功能可以在等待成功,錯誤,完成等被調用的時候執行。是否有jquery ajax函數在等待錯誤,成功或完成時調用?

我希望有這樣的:

$阿賈克斯({ ..., 等待:函數(){// 執行一些代碼 } });

如果它不在那裏,它確實應該。它不是在我的腦海智能不得不隨身攜帶的東西被稱爲AJAX功能之前...

等待可以很容易地進行一些諸如顯示加載GIF或類似的東西。

有沒有什麼做這種功能?我似乎無法找到它。

+2

等待函數和ajax調用之後調用的函數之間會有什麼區別? – yoshi

+1

除了yoshi的評論之外,我通常會說我通常會在**調用之前放置這種命令**,所以在等待命令和回調命令之間沒有競爭條件。最顯而易見的例子是'loading ...'消息顯示並隱藏在ajax調用結束時。 – Pandaiolo

+0

是的,所以提供了不同的答案,我認爲beforeSend函數是實現它的最好方法。這樣,在一個微調器的例子中,你可以在調用之前啓動它,然後使用.done()命令將它淡出。 – Fallenreaper

回答

3

試試這個

jQuery.ajax({ 
    url:"http://www.example.com/", 
    beforeSend:function(){ 
     //show loading gif 
    }, 
    success:function(resp){ 
     //handle response from server 
     //hide or remove loading gif 
    }, 
    error:function(msg){ 
     //show error message 
    } 
}); 
2

您應該在啓動請求的同時顯示加載GIF。除了readyState之外,沒有真正的方法可以知道AJAX調用的實際進度,這就是onreadystatechange的用途(在普通的JS中,我不知道/關心它在jQuery中的等價物是什麼)。

+0

beforeSend:創建一個微調器,然後在Done()它會隱藏微調器,或任何函數beforeSend調用? – Fallenreaper

+0

我想你可以這樣做,但爲什麼不把代碼添加到ajax函數調用後立即微調? –

+0

因爲它不是混在一起,所以有一個想法是它將完成不同的任務。這就是說,把它放在beforeSend有一個關於微調器的ajax調用,而不是一個函數在ajax請求 – Fallenreaper

2

這很容易,直到Ajax調用完成後顯示的好手。下面是它如何工作的一個示例:

loading = { 
    count: 0 
}; 

loading.finish = function() { 
    this.count--; 
    if (this.count==0) this.$div.hide(); 
}; 

// 
loading.start = function() { 
    this.count++; 
    if (!this.$div) { 
     var html = '<div style="position: fixed;z-index:100;left:0;top:0;right:0;bottom:0;background: black;opacity: 0.6;">'; 
     html += '<table width=100% height=100%>'; 
     html += '<tr><td align=center valign=middle>'; 
     html += '<img src=img/loading.gif>'; 
     html += '</td></tr>'; 
     html += '</table></div>'; 
     this.$div=$(html); 
     this.$div.prependTo('body'); 
    } 
    setTimeout(function(){ 
     if (loading.count>0) loading.$div.show(); 
    }, 500); 
}; 

// the function to call 
askUrl = function(url, success) { 
    var httpRequest = new XMLHttpRequest(); 
    httpRequest.onreadystatechange = function() { 
     if (httpRequest.readyState === 4) { 
      if (httpRequest.status === 200) { 
       success(msg); 
      } 
      loading.finish(); 
     } 
    }; 
    loading.start(); 
    httpRequest.open('GET', url); 
    httpRequest.send(); 
}; 

如果調用askUrl和服務器不會在500毫秒回答,屏幕上會顯示爲灰色,並顯示一個微調。

由於這是一個簡短的代碼,它實際上取決於所期望的結果,我不知道這應該在jQuery的,甚至插件可用。

我得到了我的gif微調here

3

,你有你的後電話$.ajax實際上將開始啓動呼叫後立即運行任何代碼。所以,如果你有這樣的事情:

$ajax('someurl').done(function() { /*** success function ***/ }); 
someOtherFunctionCall(); 

someOtherFunctoinCall()實際上將立即Ajax調用開始後執行,並不管呼叫的成功/失敗的發生。

+0

這個缺點之後被解僱,這是因爲雖然它在這裏看起來不錯,但是你不需要看到ajax調用和someOtherFunctionCall();這正是我想要的 – Fallenreaper

1

最好的辦法是使用beforeSend和功能齊全的Ajax請求..

$.ajax({ 
      .. Your ajax settings.. 
      success : function(result){ 
      // do what you want with data here 
      }, 
      beforeSend : function(){ 
      // Show a ajax gif here 
      }, 
      complete : function(){ 
      // Hide the ajax gif here 
      } 
    }); 

的beforeSend功能就被作爲Ajax請求打發送.. 完整的功能被觸發時,它是從成功的功能.. 所以你可以通知用戶的,當請求完成..