我有一个异步函数,用于检查表中是否已经存在id
。
async function generateIdentifier () {
try {
let exists;
let id;
do {
id = someRandomStringGenerator();
const email = await Database.find({id});
if (email.length > 0) {
exists = true;
} else {
exists = false;
}
} while (exists);
return id;
} catch (e) {
throw e;
}
}
使用上面的代码,find方法将返回一个数组。如果数组为空,则表示找不到ID。找到ID后,它将生成一个新ID,直到ID唯一为止。
此外,是的,尽管这在性能方面是可行的,但这样做有更好的选择吗?
任何帮助将不胜感激。
答案 0 :(得分:1)
是的,这是可行的,异步await的整个卖点是,只要在每次调用另一个异步函数时都添加await关键字,就可以使基于承诺的代码看起来像常规的命令式构造(例如while循环)。
在性能方面,显然可以从在服务器上生成随机ID受益,这样您始终可以获得在单个调用中唯一的ID。实际上,这可能不是问题,因为如果ID的空间足够大,则发生超过1次碰撞的情况将非常罕见。
答案 1 :(得分:1)
我建议您使用如下回调函数。我进行了一个API调用来表示您的数据库请求,然后将条件循环直到字符串中包含字符v
。这样,它将像魅力一样工作。
function loadData(callback){
$.ajax({url: "https://helloacm.com/api/random/?n=10", success: function(response){
callback(response);
}});
}
function checkData(response){
if(response.includes("w")){
console.log(response, "good");
} else {
console.log(response, "bad");
loadData(checkData);
}
}
function register(){
loadData(checkData);
}
register();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 2 :(得分:0)
infinity do while很好。您的情况很简单。如果找到记录,则返回,否则再次执行。但是,函数名称应表示它的功能。在您的情况下是注册,但实际上您是在检索随机记录。性能?好吧,您在这里并没有节省太多。您有几个异步调用,这些调用将阻塞您的脚本,直到解决为止。没有dowhile https://stackblitz.com/edit/js-bgyman
的示例