【问题标题】:JQuery : Wait for a $.post return [duplicate]JQuery:等待 $.post 返回[重复]
【发布时间】:2014-01-29 10:38:00
【问题描述】:

我的 $.post 查询有问题。这是我的代码:

function verif_subscribe_sale() {
var URL_ROOT = "http://my_website.com/";

var email_sale = document.getElementById('email-sale');
var name_sale = document.getElementById('name-sale');
var url_sale = document.getElementById('url-sale');
var password_sale = document.getElementById('password-sale');
var token = document.getElementsByName('_token');

test = 0;

$.post(URL_ROOT + 'check-url', { url: url_sale.value, token: token.value } ).done(function( data ) {

    if(data == "notok" || data.length < 4){
        document.getElementById('error_url').style.display="block";
        test = 1;                                       
    }                                           
});

if(name_sale.value.length < 4){
        document.getElementById('error_name_length').style.display="block";
        test = 1;
}

 if(check_email(email_sale) != true) {          
        document.getElementById('error_mail').style.display="block";        
        test = 1;
}   

if(test == 0){      
    return true;
}else{      
    return false;
}}

此代码是从 HTML 表单中调用的:

 <form action="{{{ URL::to('create_my_sale') }}}" method="post" onsubmit="return    verif_subscribe_sale();">

问题是,由于post是异步的,即使post返回不满足条件也可以提交表单。 是否可以在提交表单之前等待 post 循环结束?我尝试了一些 stackoverflow 解决方案(如回调),但它不起作用......

编辑部分:

我在 JS 中尝试过这种方式:

function verif_subscribe_sale(callback) {
var URL_ROOT = "http://www.mysite.com/";    

var url_sale = document.getElementById('url-sale'); 
var token = document.getElementsByName('_token');

test = 0;

$.post(URL_ROOT + 'check-url', { url: url_sale.value, token: token.value }   ).done(function( data ) {

    if(data == "notok" || data.length < 4){
        document.getElementById('error_url').style.display="block";
        test = 1;                                       
    }                                           
});

callback(test);  
}

function test_callback(test){

var name_sale = document.getElementById('name-sale');
var email_sale = document.getElementById('email-sale');
var password_sale = document.getElementById('password-sale');

if(name_sale.value.length < 4){
    document.getElementById('error_name_length').style.display="block";
    test = 1;
}

 if(check_email(email_sale) != true) {          
        document.getElementById('error_mail').style.display="block";        
        test = 1;
}   

if(test == 0){      
    return true;
}else{      
    return false;
}     
}

我这样称呼它:

<form action="{{{ URL::to('create_my_sale') }}}" id="form-sale" method="post" onsubmit="return verif_subscribe_sale(test_callback);">

但它也不起作用......

【问题讨论】:

  • 回调确实有效,并且它们是您拥有异步代码的唯一实用解决方案。您的函数将不起作用,因为您的验证在 AJAX 调用返回之前执行。您可能需要重组您的代码才能使其正常工作,但这不仅会影响您在此处拥有的功能。
  • 回调是解决这个问题的方法。这是唯一的解决方案。如果它对您不起作用,那么您需要向我们展示您的回调代码并寻求修复它的帮助;由于帖子的性质是异步的,您在此处向我们展示的代码如果不变成回调就永远无法工作。
  • 感谢您的回答。我不是 javascript 专家这不是我的代码,我不知道如何重构它...

标签: javascript jquery post asynchronous


【解决方案1】:

您最好使用 ajax,并控制您的响应(异步工作): 这是示例代码:

    var tout;
// ...

// some code ...

// ...

        function setExpressCheckout() {
            'use strict';
            var xmlhttp;

            if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp = new XMLHttpRequest();
            } else {// code for IE6, IE5
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.onreadystatechange = function () {
                var s;
                if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
                    if (tout) {
                        clearTimeout(tout);
                    }
                    s = xmlhttp.responseText;
                    // put your own code here
                }
            };

            function ajaxTimeout() {
                xmlhttp.abort();
// put some message here, or whatever ...
                clearTimeout(tout);
            }

            clearTimeout(tout);

            tout = setTimeout(function () {
                ajaxTimeout();
            }, 15000);  // 15000 miliseconds = 15 seconds. you can choose your own timeout.

            xmlhttp.open("POST", "yourPage.php", true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.send("");
        }

祝你好运!!!

【讨论】:

    【解决方案2】:

    $.post 只是$.ajax({type: "POST", ...}) 的快捷方式。

    使用 $.ajax,您可以使用参数 {async: false} 在继续执行之前等待任意时间(也可以使用超时参数)。

    【讨论】:

    • 将“async”设置为 false 不是一个好习惯。很多开发者不建议使用这种方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2016-10-16
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多