根据 XML HTTP 请求状态为另一个函数指定布尔值

give another function a boolean value depending on the xml http request status

提问人:butterfly 提问时间:11/24/2021 最后编辑:butterfly 更新时间:11/24/2021 访问量:56

问:

类似问题

我已经尝试将类似的问题应用于我的案例,但没有得出这个问题的结论。 但是,如果您有类似的问题,这些可能值得研究:

上下文

我有一个包含三个输入(名称、密码、确认密码)的表单,我想使用 Javascript 验证某些条件(例如密码的最小长度等)。因此,我创建了函数validateForm()来执行此操作。

一个标准是用户名不应该已经存在。因此,我创建了函数 userExists()(见下文),该函数由 validateForm() 调用。userExists() 本身工作正常,因为它在控制台中正确记录“存在”或“不存在”。

问题

但是,我很难在函数 validateForm() 中使用函数 userExists() 获得布尔值 (true/false)。

我发现了两个使这变得困难的问题:

  1. 从 onreadystatechange 属性中获取值
  2. 异步函数:使 validateForm() 等待 userExists() 完成然后再继续(我试图通过回调解决)

问题

如果用户已经存在,从 userExists()validateForm(),我如何获取信息?

我是 Javascript 的新手(有点不知所措),并且已经在这个问题上坐了两天了。我不确定是否存在结构问题,或者只是一点语法错误。我不知道如何解决这个问题,如果能得到一些帮助,我将不胜感激。

法典

var val;
var exists;
var performSomeAction = function (exists) {
    val = exists;
}

function validateForm() {
    const name = document.getElementById("username").value;
    //checking some inputs

    //check if the username is already in use
    console.log(nameExists);
    else if (nameExists) {
        alert("The name is already in use");
        name = "";
        return false;
    }

    //validating more inputs
}

function userExists(callback) {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 204) {
            console.log("Exists");
            callback(true);
        } else if (xmlhttp.readyState == 4 && xmlhttp.status == 404) {
            console.log("Does not exist");
            callback(false);
        }
    };

    xmlhttp.open("GET", "#aLinkThatIsNotTheIssue", true);
    xmlhttp.send("");
}

结果

控制台中的当前输出为:

undefined
Exists
javascript html ajax 回调 xmlhttprequest

评论

0赞 Randy Casburn 11/24/2021
你必须在这里帮我们一点。你显然已经做到了。您的研究 - 谢谢你。但是,您提供的结果包括您提供的代码中未包含的结果。对 UserExists 的调用也不是。您是正确的,因为这是一个异步问题,看起来像您在回调函数之外使用 or 或两者(换句话说,在回调有机会执行和完成之前)。但是很高兴看到与 where is 'd 相关的代码。returned_dataexistsvalreturned_dataconsole.log()
0赞 butterfly 11/24/2021
感谢您的通知,我尝试了很多,这就是为什么我搞砸了与代码相关的解释。我更新了我的问题,幸运的是在此期间能够找到解决方案,如果将来有人遇到与我相同的问题,我将立即在此处发布。非常感谢您帮助我解决这个问题,@RandyCasburn,我真的很感激!

答: 暂无答案