Я впервые использую API выборки, и я застрял здесь. По сути, я структурировал свой код вокруг одного из фрагментов из этого ответа. Я хотел бы использовать результаты одного запроса и заполнять их в различных полях формы, но моя текущая настройка, похоже, запускает запрос для каждого поля. Вот что у меня есть:
async function fetchUsers() {
let response = await fetch("https://randomuser.me/api/?format=json");
return response.json();
};
function getInfo() {
fetchUsers().then((data) => document.getElementById("c_fname").value = data.results[0].name.first);
fetchUsers().then((data) => document.getElementById("c_lname").value = data.results[0].name.last);
fetchUsers().then((data) => document.getElementById("c_phone").value = data.results[0].cell);
}
Я просто не могу понять, как сделать один запрос, а затем поместить этот ответ как объект в новую переменную. Тогда я мог бы легко сделать что-то вроде document.getElementById("c_phone").value = newVariable.results[0].cell;.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


кажется, выполняется запрос для каждого поля
Потому что вы вызываете fetchUsers() три раза, и эта функция выполняет этот запрос AJAX.
Просто вызовите функцию один раз и используйте полученные данные для трех элементов, которые вы хотите заполнить:
fetchUsers().then((data) => {
document.getElementById("c_fname").value = data.results[0].name.first;
document.getElementById("c_lname").value = data.results[0].name.last;
document.getElementById("c_phone").value = data.results[0].cell;
});
Нет правила, согласно которому вы можете выполнять только одну операцию в обратном вызове .then(). То, что вы передаете этому обратному вызову, является функцией, и эта функция может содержать столько кода, сколько вам нужно.
Вы можете использовать Назначение деструктурирования, чтобы получить простые пользовательские атрибуты.
const fetchUsers = async() => {
let response = await fetch('https://randomuser.me/api/?format=json');
return response.json();
};
fetchUsers().then(({
results
}) => {
const [user] = results;
document.getElementById('c_fname').value = user.name.first;
document.getElementById('c_lname').value = user.name.last;
document.getElementById('c_phone').value = user.cell;
});body {
background-color: #255E7B;
color: #47DAC1;
}
.link-alike {
cursor: pointer;
text-decoration: underline;
color: #F1D13D;
}
.link-alike:hover {
color: #fbd422;
}<form action = "/checkout_success" method = "post" id = "hidden_form">
<input type = "hidden" name = "nonce" id = "nonce" />
<h3>Payment Total</h3>
<label for = "total">Total</label><br />
<input type = "number" id = "total" name = "total" value = "1.00" onblur = "formValidation()" /><br />
<h3>Customer Info</h3>
<div class = "link-alike" id = "randomizer-link" onCLick = "getInfo()">
Random info?
</div>
<br />
<label for = "c_name">Name</label><br />
<input type = "text" id = "c_fname" name = "c_fname" placeholder = "First" required size = "7" required />
<input type = "text" id = "c_lname" name = "c_lname" placeholder = "Last" required size = "7" required /><br />
<label for = "c_phone">Phone</label><br />
<input type = "string" id = "c_phone" name = "c_phone" /><br />
<label for = "c_street">Street Address</label><br />
<input type = "text" id = "c_street" name = "c_street" required /><br />
<label for = "c_street2">Address Line 2</label><br />
<input type = "text" id = "c_street2" name = "c_street2" /><br />
<label for = "c_city">City</label><br />
<input type = "text" id = "c_city" name = "c_city" required /><br />
<label for = "c_state">State/ Province</label><br />
<input type = "text" id = "c_state" name = "c_state" required /><br />
<label for = "c_country">Country</label><br /> [PLACEHOLDER]
</form>
Это именно то, что мне нужно. Я уже пробовал это, но не думал использовать фигурную скобку, поэтому он продолжал терпеть неудачу. Огромное спасибо за решение моей утренней головной боли.