我经历了很多关于此的帖子,但没有找到适合我的任何解决方案 - 清理代码:
$('#form-new').submit(function(e){
e.preventDefault();
$curForm = $(this);
$textbox = $( '.new-box' ,this);
window.tmp_input_ok = false;
var wasError = false;
if( $.trim($textbox.val()) == "" ){
wasError = true;
}
if( wasError ){
//possible message
} else{
var jqxhr = $.post(
$(this).attr('action'),
$(this).serialize(),
function(data, textStatus, jqXHR){
if( data=="200" ){
console.log('post OK'); //this shows in console!
window.tmp_input_ok = true;
} else{
console.log('not OK');
}
}
).fail(function() {
console.log('POST fail)');
});
}
//however, window.tmp_input_ok is false here so the textbox does not empty:
if(window.tmp_input_ok == true) $textbox.val('');
else console.log('input not ok :('); //and this is outputted to console
});
原来,只有var tmp_input_ok = false
初始化,然后使用tmp_input_ok
变量,但它没有工作,所以我尝试了全局窗口...也不起作用...我开始绝望。
答案 0 :(得分:2)
您的if
语句在通话结束前执行。
$.post
是异步调用,其余代码在帖子处理时继续
您已使用.fail()
,如果您想在完成时始终执行.always()
语句,可以添加if
,或者如果您只想要.success()
,则可以添加if (wasError) {
//possible message
} else {
var jqxhr = $.post($(this).attr('action'), $(this).serialize(), function (data, textStatus, jqXHR) {
if (data == "200") {
console.log('post OK'); //this shows in console!
window.tmp_input_ok = true;
} else {
console.log('not OK');
}
// either add it here if you only want to process it on success
if (window.tmp_input_ok == true) $textbox.val('');
else console.log('input not ok :(');
}).fail(function () {
console.log('POST fail)');
}).always(function(){ // or add it here if you always wan to execute on completion regardless of fail or success
if (window.tmp_input_ok == true) $textbox.val('');
else console.log('input not ok :(');
});
}
在通话成功时检查它,类似于:
{{1}}
答案 1 :(得分:1)
您的XHR请求具有onSuccess回调的原因是因为该调用是异步的。
以这个简单的代码为例:
$.get(
'/foo',
function(){
alert("data received");
}
)
alert ("End of script reached");
成功回调设置为在成功接收请求时将调用的内容,而不是在浏览器读取该行代码时。
通常,您会在“收到数据”警报之前看到“已达到脚本结束”警报,因为完整的XHR请求将花费超过100毫秒,而读取这几行将只占其中的一小部分。
必须通过回调调用依赖于对状态的响应的代码。有很多方法可以让我详细说明。