收到请求后,我希望它生成一个4个字符的代码,然后检查它是否已存在于数据库中。如果是这样,则生成一个新代码。如果没有,请添加并继续。这是我到目前为止所拥有的:

var code = "";
var codeFree = false;
while (! codeFree) {
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    var code = "";
    for (var i = 0; i < 4; i++) {
        var rand = Math.floor(Math.random() * chars.length);
        console.log(rand);
        code += chars.charAt(rand);
    }
    console.log("Code: %s generated.", code);

    client.execute("select * from codes where code=" + code, function(err, result) {
        if (! err) {
            if (result.rows.length > 0) {
                codeFree = false;
            } else {
                codeFree = true;
            }
        } else {
            console.log('DB ERR: %s', err);
        }
        console.log(codeFree);
    });
    console.log('here');
}


这几乎不能满足我的要求。我该如何处理这样的事情?

最佳答案

您正在执行异步任务。

当您的过程中有一个异步任务时,您需要一个回调函数,该函数将使用所需的值作为其参数进行调用。

找到免费代码后,将调用该函数并将代码作为其参数传递,否则,将再次调用getFreeCode函数并将相同的回调传递给它。尽管您可能会考虑发生错误的情况。如果您的db调用失败,则将永远不会调用您的回调。最好使用throw / catch机制或将另一个错误参数传递给回调。

您可以通过以下方式完成您需要做的事情:

function getFreeCode(callback) {
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    var code = "";
    for (var i = 0; i < 4; i++) {
      var rand = Math.floor(Math.random() * chars.length);
      console.log(rand);
      code += chars.charAt(rand);
    }
    console.log("Code: %s generated.", code);

    client.execute("select * from codes where code="+code, function(err, result) {
      if(!err) {
        if(result.rows.length > 0) {
          getFreeCode(callback);
        } else {
          callback(code);
        }
      }else {
        console.log('DB ERR: %s', err);
      }
      console.log(codeFree);
    });
    console.log('here');
}




// in your main:

getFreeCode(function (code) {
    console.log(' this code was free: ' + code)
})

关于javascript - Node.js功能流程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34248154/

10-10 00:34