my-*_*unt 1 javascript async-await
我正在尝试使用 async/await,但“await”不会等待。
我想要实现的是:
上述每一点都是一个单独的函数,只有在前一个函数完成后才应该运行。我不知道为什么显示数据(功能 2)不等待获取数据(功能 1)完成。
我曾多次尝试修改代码,但无法使其工作。我花了相当多的时间在 SO 上,查看类似的问题,我读过 MDN 和网上很多关于 async-await 的文章,但我只是不知道我在哪里犯了错误......
这是一个JSFiddle,但它没有“console.log”响应,所以我还将显示实际浏览器显示的内容。
代码:
超文本标记语言
<main>
<div class="d-flex justify-content-around">
<div class="container row">
<div class="col-12" id="displayNumbers" style="min-height: 300px; border: 1px solid black;"></div>
<div class="col-12">
<div class="btn" id="trigger" style="border: 1px solid red">
Async / Await
</div>
</div>
</div>
</div>
</main>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js"
integrity="sha384-oBqDVmMz9ATKxIep9tiCxS/Z9fNfEXiDAYTujMAeBAsjFuCZSmKbSSUnQlmh/jp3" crossorigin="anonymous">
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/js/bootstrap.min.js"
integrity="sha384-7VPbUDkoPSGFnVtYi0QogXtr74QeVeeIs99Qfg5YCF+TidwNdjvaKZX19NZ/e6oz" crossorigin="anonymous">
</script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
JS
var displayArea = document.getElementById("displayNumbers");
async function fetchNumbers(){
console.log("--fetchNumbers--")
axios.get("http://numbersapi.com/random/year?json",
).then(function (response) {
console.log("response fetchNumbers data:")
console.log(response.data);
numbersData = response.data;
})
}
async function displayNumbers(data){
console.log("--displayNumbers--")
console.log(data);
for (let d in data){
console.log(d);
let div = document.createElement("div");
div.textContent = data[d].toString();
displayArea.appendChild(div);
}
}
async function processNumbers(){
console.log("--processNumbers--")
let divs = displayArea.querySelectorAll("div");
for (let div of divs){
const reg = new RegExp('^[0-9]+$');
if (reg.test(div.textContent)){
div.style = "background-color: black; color: white;"
}
}
}
var numbersData = {};
async function async_numbers(){
try{
await fetchNumbers();
await displayNumbers(numbersData);
await processNumbers();
} catch(e){console.log("Error " + e)}
}
document.getElementById("trigger").addEventListener("click", async() => {
async_numbers();
})
Run Code Online (Sandbox Code Playgroud)
控制台日志:
--fetchNumbers--
--displayNumbers--
Object { }
--processNumbers--
response fetchNumbers data:
Object { date: "April 29", text: "1623 is the year that a fleet of 11 Dutch ships depart for the coast of Peru, seeking to seize Spanish treasure on April 29th.", number: 1623, found: true, type: "year" }
Run Code Online (Sandbox Code Playgroud)
如您所见,--displayNumbers--无需等待response fetchNumbers data。
任何帮助/评论/解释将不胜感激。
PS:如果我可以以任何方式改进这个问题,请告诉我。
编辑
错误处理开启await axios.get
try{
const response = await axios.get("http://numbersapi.com/random/year?json")
console.log("response fetchNumbers data:")
console.log(response.data);
return response.data
}catch(e){console.log("error handling")};
Run Code Online (Sandbox Code Playgroud)
这里有几个问题:
await你的 上缺少一个axios.get()。.then()在某种程度上是一种反模式。response.data比将其分配给全局更好。displayNumbers也不processNumbers需要是异步函数。fetchNumbers()可以重写为:
async function fetchNumbers(){
console.log("--fetchNumbers--")
const response = await axios.get("http://numbersapi.com/random/year?json")
console.log("response fetchNumbers data:")
console.log(response.data);
return response.data
}
async function async_numbers(){
try{
const numbersData = await fetchNumbers();
// Remove async from both declarations. Not needed.
displayNumbers(numbersData);
processNumbers();
} catch(e){console.log("Error " + e)}
}
Run Code Online (Sandbox Code Playgroud)