2011-07-28 59 views
1

我有一些数据发送到服务器的jQuery和我失去了很多功能,如阿贾克斯。员额如何使用JQuery同步发送数据到服务器?

的条件非常简单:一个表格必须发送同步,它不会返回任何值,但如果有错误,我们不得不停止发送更多数据(实际上,我发送了一堆表单)。

所以,问题是:哪个是最好的功能,哪些是我必须使用的最小参数?

此刻,我的做法是这样的:

  $.ajax({ 
       url: form.attr('action'), 
       type: 'POST', 
       data: form.serialize(), 
       async: false, 
      }); 

但你可以看到,我没有收到,如果错误返回值。

+0

那么,这是什么问题?这不工作吗? – Nanne

+0

我实际上并不确定我是否正确:您是否需要发送多个请求来分块数据,或确保用户不会一次提交多次? – giraff

回答

4

如何异步调用,但递归:

var index = 0; 
var data = ["some","data","chunks"]; 

function submit_data() 
{ 
    if (index == data.length) 
     return; //Done ! 

    index++; 

    $.ajax({ 
     url: form.attr('action'), 
     type: 'POST', 
     data: data[index - 1], 
     success: submit_data 
    }); 
} 

每个HTTP请求不返回OK停止进一步的数据交换(如函数被再次调用只是对200 OK HTTP状态) 。

0

这是一个可怕的想法。由于JavaScript是单线程的,它将阻止所有脚本响应,直到服务器返回。这将导致用户界面中没有任何反应导致不满意的用户。代码模型:)

+1

问题是“我如何做一个同步请求。“”不这样做“不是一个答案,恕我直言,这是一条评论。 –

+0

教一个人钓鱼和养活他一辈子。给一个男人一条鱼... –

+0

评论不教人的事情?你不能回答真正的问题*和*说“但这不是一个好主意”? –

2

如果你真的想做一个同步帖子,你将不得不使用ajax。我认为这是最小(少,如果你不关心的成功,或者不在乎失败):

$.ajax({ 
    url: form.attr('action'), 
    type: 'POST', 
    data: form.serialize(), 
    async: false, 
    success: function(response) { 
     // It worked (at the HTTP level). You could have the 
     // server return something you can use for business 
     // level success (or use an HTTP error code for errors); 
     // if you return something, you can access it here as 
     // `response`. (If not, you can remove that argument.) 
    }, 
    error: function() { 
     // It failed (at the HTTP level), so stop sending the 
     // other forms. 
    } 
}); 

题外话1:你的原剧本有一个悬空逗号在对象文字的末尾。你想避免这种情况,IE6 and IE7 don't like it

偏题2:做同步 ajax请求通常不是你最好的选择。同步请求往往会在请求发生时完全锁定浏览器的用户界面(在某些浏览器中,不仅仅是在您的选项卡上,而是在每个选项卡上),从而导致糟糕的用户体验。相反,禁用任何必须禁用的输入,执行异步请求,然后在请求完成时重新启用它们。如果您一个接一个发送大量表单,则可以链接请求,从成功完成前一个请求开始发出下一个请求。

+2

我同意TJ在服务器上使用异步提交和最小的feedbakc可以给你更好的错误恢复,并显示一个很好的进度指示器对于用户来说。“第1张7上传..” – Eddie

+0

@Eddie:哦,关于状态更新的好处 –

-1

通过将async设置为false,可以使用同步呼叫。

$.ajax({ 
    url: form.attr('action'), 
    type: 'POST', 
    data: form.serialize(), 
    async: false 
}); 
+0

因为他在代码中有'async:false'这个问题,我以为他知道那么多。 (*编辑*:不是我的downvote。) –

0

您是否在寻找基本的HTTP错误?见T.J.的答案。如果您希望服务器获得一些反馈,您需要收回一些数据,JSON对此很有帮助。

function submitRating(object) { 
      log.debug("will submit: " + object.html()); 
      log.profile("Rating Project"); 

      $.post("\+rate", { 
       projectKey : "${projectDto.key}", 
       rating : object.html() 
      }, function(ratingDto) { 
       log.debug("response recieved"); 
       if(ratingDto.duplicate){ 
        $('#ratingMessage').html(ratingDto.message); 
        $('#ratingMessage').fadeIn(200).delay(800).fadeOut(200); 
       }else{ 
        $('#projectRating').html(ratingDto.rating); 
        $('#projectRatingCount').html(ratingDto.ratingCount); 
        $('.current-rating').css('width',''+(30 * ratingDto.rating)+'px'); 
        $('.current-rating').html('Currently ' + ratingDto.rating + '/5'); 
       } 
       log.profile("Rating Project"); 
      },'json'); 
     } 
+0

'getJSON'(顾名思义)做了GET,而不是POST。 –

+0

是的,对不起,你可以使用post并指定'json'作为第四个参数。 – Eddie

相关问题