如何在JavaScript的异步函数中使用do / while语句?

时间:2018-10-15 06:05:37

标签: javascript ecmascript-6 async-await

我有一个异步函数,用于检查表中是否已经存在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唯一为止。

此外,是的,尽管这在性能方面是可行的,但这样做有更好的选择吗?

任何帮助将不胜感激。

3 个答案:

答案 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

的示例