【问题标题】:Javascript, script running too fast? [duplicate]Javascript,脚本运行太快? [复制]
【发布时间】:2018-06-16 17:10:29
【问题描述】:

我有一个名为 check 的变量,它将接收“真/假”值。通过一个名为 checkUserExist() 的函数。

然后我有一个 if 语句来检查它是真还是假。

问题是我的 if 语句在“check”从它调用的函数中获取值之前运行。所以检查仍然未定义。

function createUser(){

    let userName = document.getElementById("create_username").value,
        password = document.getElementById("create_password").value;
    console.log("Create user")
    console.log("Username:", userName, "Password:", password)

    var check = checkUsersExist(userName)

    console.log("Svar fra checkUsers",check)

    if(check == "true"){
        console.log("UserName all ready exists")
    }else if(check == "false") {
        console.log("UserName is avaible")
    }else{
        console.log("An error has uccured")
    }
}
function checkUsersExist(userName){
    let headers = new Headers();
        headers.append('Content-Type', 'application/json');

    var init = {
        method: 'PUT',
        headers: headers,
        body: `{
            "userName":"${userName}"}`,
        cache: 'no-cache',
        mode: 'cors'
        };

    var request = new Request('http://localhost:3000/users/check', init);

    fetch(request)
        .then(response => 
            {
                console.log("Response", response, "Request sent to server", request)
                return response;
            })
        .catch(err => 
            {   
                console.log(err)
            });

}

我已经坚持了很长一段时间。而且我不确定如何解决它。我在 checkUserExist() 中的获取确实从我的路线中得到了我正在寻找的答案

如果您也有兴趣查看,这是我的路线。

module.exports = function (server) {
    server.put('/users/check', function (req, res) {
        console.log("")
        console.log("=========== NEW CHECK ============")
        console.log("")
        console.log("Kom til check på route")
        let userName = req.body.userName,
            check = "false";

        console.log("UserName received from Index.html =", userName)

        fs.readFile('./resources/users.json', 'utf8',
            function readFileCallback(err, data){
                if (err){
                    console.log(err);
                } 
                else {
                    users = JSON.parse(data); //now its a object

                    for (i = 0; i < users.table.length; i++) {
                        if(users.table[i].userName == userName){
                            console.log("===Current Check===")
                            console.log("Table =", users.table[i].userName, "Index =", userName)
                            check = "true"
                        }
                    }

                    console.log("check værdi =", check)
                    res.json(200, check)
                }
            }
        );

    });

我正在使用 Json 文件和 Cookie 来提高我的技能,因此我没有在这个项目中使用数据库。

【问题讨论】:

  • 这就是异步代码的棘手之处。您的脚本正在通过checkUsersExist,因为该函数中的fetch 与该块的其余部分异步运行。 Promise 会在这里帮助你很多:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 你点了一份披萨,一挂断电话,你就想吃披萨。

标签: javascript json routes promise restify


【解决方案1】:

您的 checkUserExists 将始终返回 undefined,无论它是否快速完成,因为它是异步的。您需要做的是向您的 checkUsersExist 添加一个回调机制,以便在收到响应时调用您的回调。我无法验证我在下面提供的更新代码,但您可以试一试。

function createUser() {

  let userName = document.getElementById("create_username").value,
    password = document.getElementById("create_password").value;
  console.log("Create user")
  console.log("Username:", userName, "Password:", password)

  checkUsersExist(userName, function(check) {
    console.log("Svar fra checkUsers", check)

    if (check == "true") {
      console.log("UserName all ready exists")
    } else if (check == "false") {
      console.log("UserName is avaible")
    } else {
      console.log("An error has uccured")
    }
  })
}

function checkUsersExist(userName, onSuccess) {
  let headers = new Headers();
  headers.append('Content-Type', 'application/json');

  var init = {
    method: 'PUT',
    headers: headers,
    body: `{
            "userName":"${userName}"}`,
    cache: 'no-cache',
    mode: 'cors'
  };

  var request = new Request('http://localhost:3000/users/check', init);

  fetch(request)
    .then(response => {
      console.log("Response", response, "Request sent to server", request)
      onSuccess(response);
      return response;
    })
    .catch(err => {
      console.log(err)
    });

}

【讨论】:

  • 还是不行……你不能从异步方法返回……
  • 我没有说异步函数会返回值。在更新的 checkUsersExist 中,该方法接收一个回调参数 onSuccess。 onSuccess 在收到来自服务器的响应时被调用。
  • 这实际上非常完美。我不得不稍微改变一下获取方式。但它现在完全按照我的意愿去做: fetch(request) .then(function(response){ // console.log("Response", response, "Request sent to server", request) return response.json() ; }) .then(function(result){ console.log("Result = "+result) onSuccess(result); }) .catch(function(err){ console.log(err) });所以谢谢你的帮助!
【解决方案2】:

由于这是一个异步调用,因此在 Request 收到回复之前已到达函数“checkUsersExist”的末尾。因此,您会得到“未定义”的结果。

尝试用回调编写你的函数,用函数调用替换return语句,然后这样调用它:

checkUsersExist(userName, check => {
    if(check === "true"){
        console.log("UserName all ready exists")
    }else if(check === "false") {
        console.log("UserName is avaible")
    }else{
        console.log("An error has uccured")
    }

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2013-12-08
    相关资源
    最近更新 更多