2012-09-07 78 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请求打发送.. 完整的功能被触发时,它是从成功的功能.. 所以你可以通知用户的,当请求完成..