收到请求后,我希望它生成一个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/