我的解决方案"返回true;"嵌套函数内部没有工作

时间:2015-03-30 11:09:34

标签: javascript jquery

我发布了一个标记为重复的问题,因为这让我对在嵌套函数中发布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”。当我编写新的解决方案时,我才明白这一点,感觉就像我跑了一个大圈子并回到我的问题的开始。我现在完全理解为什么它会返回错误,我不明白的是能让我走到尽头的解决方案(没有回到开头)。

我尝试了一些愚蠢的东西,即包装返回结果;在延迟功能中,这是一场灾难。

有人可以帮助我吗?

1 个答案:

答案 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,所以不要依赖超时来猜测何时完成,而是使用回调方法提交表单