У меня есть функция 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 вернет массив. Если массив пуст, значит, идентификатор не найден. Когда идентификатор найден, он должен генерировать новый, пока идентификатор не станет уникальным.
Кроме того, да, это работает, хотя производительность мудрая, есть ли лучшие варианты с такими вещами?
Любая помощь приветствуется.
Я предлагаю вам использовать функцию обратного вызова, как показано ниже. Я принял вызов 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>
onRenderElement(callback)
не имеет смысла ждать элемента, потому что мне нужно выполнять рендеринг в любое время, когда данные выходят из-под контроля / потока. Однако, если вы управляете потоком, то Promises - это путь. Асинхронизация и ожидание - это просто еще один способ написать обещание.
Да, это работает, все точки продажи async ждут, что вы можете сделать код на основе обещаний похожим на обычные императивные конструкции (например, на циклы), просто добавив ключевое слово await, когда вы вызываете другую функцию async.
Разумеется, вы могли бы выиграть от генерации случайного идентификатора на сервере, чтобы вы всегда получали идентификатор, который, как известно, уникален в одном вызове. На практике это, вероятно, не проблема, так как наличие более одного столкновения, вероятно, будет очень редко, если пространство идентификаторов достаточно велико.
бесконечность делает это хорошо, когда у вас есть несколько случаев, когда вам нужно изменить условие цикла. В вашем случае это просто. Если найденная запись, в противном случае верните ее снова. Однако имя функции должно представлять ее функцию. В вашем случае регистр, но на самом деле вы получаете случайную запись. Спектакль? Что ж, вы здесь не очень много спасите. У вас есть асинхронные вызовы, которые будут блокировать ваш скрипт до разрешения. Пример без dowhile https://stackblitz.com/edit/js-bgyman