当jQuery返回错误时,如何在jQuery中重新发送ajax请求

How do I resend an ajax request in jQuery when it returns an error?

本文关键字:jQuery 新发送 ajax 请求 错误 返回      更新时间:2023-09-26

我的javascript中有一个ajax请求,它正在向Rails控制器发送数据。如果控制器发现数据与数据库中已有的信息重复,则返回"不可处理实体"错误。

我想打开一个对话框,询问用户是否确定要插入重复信息。如果用户同意,我想向数据对象添加另一个密钥,然后重试请求。添加的密钥将是一个忽略重复检查并插入数据的标志。

$.ajax({
      url: '/url',
      type: 'post',
      data: this.buildData(),
      success: function() {
        bootbox.alert('Information added', function() {
            Backbone.history.loadUrl();
          }.bind(this)
        );
      }.bind(this),
      error: function(jqXHR, textStatus, errorThrown) {
        if(errorThrown === 'Unprocessable Entity') {
          bootbox.confirm('Do it anyway?', function(confirm) {
              if(confirm) {
                /*Here I want to add another key to the data object and resend the request*/ 
              }
             }.bind(this)
           );
         }  
       }.bind(this)
    });

我该如何做这件事,或者更好的是,有更好的方法来完成我想要完成的事情吗?

首先,我确信有一些插件可以实现这一点。

但是如果没有合适的插件,你总是可以做这样的

function dispatchAjax( options ){
     options = $.extend({},options);
     var data = $.extend({}, this.buildData(), options.data );
     $.ajax({ ... , 
                  error : function( ) { .... 
                             if ( typeof(options.retry) == "function" ){
                                   var retryFunc = options.retry;
                                   options.retry = null;
                                   options.data = { "extraKey":"extraValue"};
                                   dispatchAjax( options );
                             }
             });
}

给我一些时间来确保它正常运行,并给出完整的代码

您可能感兴趣的另一种方法是使用同步调用。JQuery的ajax请求中的{"async":false}

我知道这似乎违背了目的,但我发现它对服务器端验证非常有用,所以它可以满足你的需求,你不必像我上面展示的那样处理复杂的处理程序,它只是这样的:

  var result = dipatchRequest( options, /*async*/  false, /*ignore-duplicates*/ false );
  if ( result.error && confirm(..) ){ 
       dispatchRequest(options, true, true);
  }