Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 停止事件在Deliver.reject上继续_Javascript_Jquery_Ajax_Promise_Deferred - Fatal编程技术网

Javascript 停止事件在Deliver.reject上继续

Javascript 停止事件在Deliver.reject上继续,javascript,jquery,ajax,promise,deferred,Javascript,Jquery,Ajax,Promise,Deferred,希望你们中的一些人能帮我解决这个问题 我有几个导航链接在我的应用程序上面,有活动和非活动状态。理论上,我想从一个跳转到另一个,如果存在不完整/无效的表单,我会触发验证错误并保持在同一页面上。在我的例子中,表单验证工作正常,但顶部的导航链接将状态从非活动更改为活动,以单击的为准 我有一个ValidateForm函数,如果表单有效,它将验证并提交表单,否则它将返回deferred.reject() 我有一个点击事件,点击这些顶级导航链接,如下所示: var DonutsClickEvent = fu

希望你们中的一些人能帮我解决这个问题

我有几个导航链接在我的应用程序上面,有活动和非活动状态。理论上,我想从一个跳转到另一个,如果存在不完整/无效的表单,我会触发验证错误并保持在同一页面上。在我的例子中,表单验证工作正常,但顶部的导航链接将状态从非活动更改为活动,以单击的为准

我有一个ValidateForm函数,如果表单有效,它将验证并提交表单,否则它将返回deferred.reject()

我有一个点击事件,点击这些顶级导航链接,如下所示:

var DonutsClickEvent = function (e, arg) {
    var url = $(this).attr('data');
    var data = { param: arg };

    if (typeof url === "undefined") return false;

    $.when(window.ValidateForm(false)).then(
        function () {
            LoadPartialView_Main(url, data);                
        },
        function(){
            return false; // I'm trying to return false here to stop event from continuing 
        }
    );  
    Console.log("This statement runs before $.when completes");
    // and event continues and the clicked nav button changes 
    // its state from non-active to active, even though form doesn't validate
}
我最近在我的代码中添加了$。延迟功能,因为一些事件的触发顺序混乱。。。在validateForm方法返回true或false之前,基于此,如果为true,我将继续执行事件,如果为false,我将停止,一切正常

我不知道我做错了什么。我很感激任何帮助

谢谢


Johny

您无法异步决定是否要阻止默认操作。当您获得异步结果时,您的函数已经返回,并且默认操作已经发生

如果必须异步验证,则必须始终阻止默认操作。如果验证成功,则必须使用Javascript手动执行所需的操作

因此,假设
LoadPartialView\u Main()
是验证成功时希望发生的事情,您可以执行以下操作:

var DonutsClickEvent = function (e, arg) {
    var url = $(this).attr('data');
    var data = { param: arg };

    if (typeof url === "undefined") return false;

    window.ValidateForm(false).then(function () {
        LoadPartialView_Main(url, data);
    }, function(err){
        // probably show validation error message to the user here
    });  
    // always prevent default action
    return false;
}


此外,没有理由使用带有单个承诺的
$.when()
。您只需使用
window.ValidateForm(…)。然后(…)

谢谢您的回复。是的,我的回报是假的;在“then”之外,但问题是,即使验证没有问题,它也总是会阻止默认操作。我想我可以像你建议的那样手动处理活动/非活动状态切换。只需一个承诺。您只需使用window.ValidateForm(…)。然后(…)-很高兴知道,谢谢!我按照您的建议做了,始终防止默认操作-当表单验证和提交成功时,我手动触发顶部导航状态更改。我刚刚通过上一篇文章了解了如何使用jquery、Promise等。谢谢你花时间帮忙。非常感谢。事实证明,
ValidateForm()
函数中实际测试验证的任何内容都不是异步的。根本没有理由在那里使用承诺。它可以是一个简单的同步函数,返回表单是否有效。你似乎让这件事变得比实际需要困难得多。嗯。。你能看看我刚才问的这个问题吗?你有什么想法?谢谢你的时间。另外,如果表格有效的话,我会把它寄出去。这是我主要关心的问题。是的,您发布了表单,但您没有将其与承诺挂钩,因此承诺没有做任何有用的事情。其他问题的公认答案有一个连接到
$.POST()
ValidateForm()
。因为
$.ajax()
已经返回了一个承诺,所以不需要将其包装成延迟的。我不完全确定这里的整个问题是什么(包括两个问题的所有问题),以确切地知道该建议什么。您必须准确地描述您试图实现的目标,就好像您正在编写一个规范来说明它应该如何工作一样。
var DonutsClickEvent = function (e, arg) {
    var url = $(this).attr('data');
    var data = { param: arg };

    if (typeof url === "undefined") return false;

    window.ValidateForm(false).then(function () {
        LoadPartialView_Main(url, data);
    }, function(err){
        // probably show validation error message to the user here
    });  
    // always prevent default action
    return false;
}