我的javascript中有一个ajax请求,它正在向Rails控制器发送数据。如果控制器发现数据与数据库中已有的信息重复,则返回“Unprocessable Entity”错误。
我想打开一个对话框,询问用户是否确定要插入重复信息。如果用户说是,我想向数据对象添加另一个密钥并重试该请求。添加的密钥将是一个忽略重复检查并仍然插入数据的标志。
$.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)
});
我将如何做到这一点,或者更好的是,有没有更好的方法来做我想要完成的事情?
答案 0 :(得分:0)
首先,我确信有一些插件。
但如果没有适合的插件,你可以随时做这样的事情
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);
}