我发布了一个标记为重复的问题,因为这让我对在嵌套函数中发布return true;
进行了一些研究。我现在了解异步代码,但我仍然难以编写解决方案。
最初导致我出现问题的代码是:
我用来在on(“submit”)函数中提交表单。if($('input[name="lat"]').length){
// submit the form after checks have been made
return true;
} else {
e.preventDefault();
geocode_clientside();
setTimeout(function () {
return true;
}, 1000); // in milliseconds
}
经过多次阅读,我得到了这个:
var result = false;
if($('input[name="lat"]').length){
// submit the form after checks have been made
result = true;
} else {
e.preventDefault();
geocode_clientside();
setTimeout(function () {
result = true;
// console log just to help me with debugging
console.log('settimeout: ' + result);
}, 1000); // in milliseconds
}
// console log just to help me with debugging
console.log('end: ' + result);
return result;
这显然不起作用,因为当输入[name =“lat”]没有长度时return result;
返回“false”。当我编写新的解决方案时,我才明白这一点,感觉就像我跑了一个大圈子并回到我的问题的开始。我现在完全理解为什么它会返回错误,我不明白的是能让我走到尽头的解决方案(没有回到开头)。
我尝试了一些愚蠢的东西,即包装返回结果;在延迟功能中,这是一场灾难。
有人可以帮助我吗?
答案 0 :(得分:1)
由于您要进行表单提交,可以直接调用表单元素的提交方法。
因此,在else
块中,您将阻止默认表单提交,从而阻止在单击时提交表单。然后在计时器中,如果要提交表单,可以调用submit()方法(它不会调用提交处理程序)
$('form').submit(function () {
var form = this;
if ($('input[name="lat"]').length) {
// submit the form after checks have been made
return true;
} else {
e.preventDefault();
geocode_clientside();
setTimeout(function () {
form.submit();
}, 1000); // in milliseconds
}
})
注意:您的评论中使用的是geolocation api,所以不要依赖超时来猜测何时完成,而是使用回调方法提交表单