Как использовать оператор do / while в асинхронной функции в JavaScript?

1

У меня есть функция async, которая проверяет, существует ли 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 вернет массив. Если массив пуст, значит, идентификатор не найден. Когда идентификатор найден, он должен генерировать новый, пока идентификатор не станет уникальным.

Кроме того, да, это работает, хотя производительность мудрая, есть ли лучшие варианты с такими вещами?

Любая помощь приветствуется.

  • 0
    Поиск выдает исключение, если идентификатор не существует?
  • 0
    Это может быть связано с использованием async / await с циклом forEach
Показать ещё 4 комментария
Теги:
ecmascript-6
async-await

3 ответа

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>
  • 0
    какая польза от использования обратных вызовов здесь?
  • 0
    Я не совсем уверен, что вы имеете в виду под 2 различными взаимодействиями, но как только вы используете обратные вызовы, это действительно так, и я имею в виду, что очень трудно реорганизовать ваш код в соответствии с обещаниями. Обратные вызовы хороши, если вы хотите зарегистрировать метод, который будет вызываться вне вашего потока. Например, onRenderElement(callback) не имеет смысла ждать элемента, потому что мне нужно выполнять рендеринг в любое время, когда данные выходят из-под контроля / потока. Однако, если вы управляете потоком, то Promises - это путь. Асинхронизация и ожидание - это просто еще один способ написать обещание.
Показать ещё 1 комментарий
1

Да, это работает, все точки продажи async ждут, что вы можете сделать код на основе обещаний похожим на обычные императивные конструкции (например, на циклы), просто добавив ключевое слово await, когда вы вызываете другую функцию async.

Разумеется, вы могли бы выиграть от генерации случайного идентификатора на сервере, чтобы вы всегда получали идентификатор, который, как известно, уникален в одном вызове. На практике это, вероятно, не проблема, так как наличие более одного столкновения, вероятно, будет очень редко, если пространство идентификаторов достаточно велико.

  • 0
    Спасибо. Код на самом деле работает на сервере.
0

бесконечность делает это хорошо, когда у вас есть несколько случаев, когда вам нужно изменить условие цикла. В вашем случае это просто. Если найденная запись, в противном случае верните ее снова. Однако имя функции должно представлять ее функцию. В вашем случае регистр, но на самом деле вы получаете случайную запись. Спектакль? Что ж, вы здесь не очень много спасите. У вас есть асинхронные вызовы, которые будут блокировать ваш скрипт до разрешения. Пример без dowhile https://stackblitz.com/edit/js-bgyman

  • 1
    Это довольно мило. Обязательно попробую это!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню