javascript - JS - 为什么 await 在课堂上不起作用
问题描述
我需要在一个类的函数中等待一段时间。我试图改编Jonas W.答案:https ://jsfiddle.net/5wk2cohe/
const sleep = ms => new Promise(res => setTimeout(res, ms));
class K {
run(n) {
(async function() {
document.body.textContent = n;
await sleep(1000);
})();
}
}
var v = new K();
for (let n = 0; n < 4; n++) {
v.run(n);
}
但是计数会立即提示 3. 如果我运行https://jsfiddle.net/tctxcn9o/ ,我会看到一个计数器例外:
const sleep = ms => new Promise(res => setTimeout(res, ms));
(async function() {
for(let n = 0; n < 4; n++) {
document.body.textContent = n;
await sleep(1000);
}
})();
我做错了什么?
[更新] 一些背景:在我的家乡,一个非常古老的程序 JavaKara 非常流行,它可以帮助高中学生学习如何编码:
看看瓢虫是如何移动的,对于理解和发现你的错误非常有帮助。所以我试图在瓢虫的每一步之后等待一段时间。
解决方案
正如El Aoutar Hamza所说,您正在创建 4 个异步任务,其中每个任务都会立即运行。为了延迟下一个任务,您需要await
在循环内部使用并使run
函数返回一个 Promise,如下所示:
const sleep = ms => new Promise(res => setTimeout(res, ms));
class K {
async run(n) {
document.body.textContent = n;
await sleep(1000);
}
}
(async function() {
var v = new K();
for (let n = 0; n < 4; n++) {
await v.run(n);
}
})();
推荐阅读
- node.js - ENOENT 错误 - 安装 aws-cdk 节点模块
- spring - 在 spring r2dbc 中创建表
- javascript - 使用java提取双引号之间的字符串
- asp.net-core - OpenIddict 示例 - 将“唯一名称”添加到 id_token
- kubernetes - 如何动态分配资源限制?
- python - 返回 True/False 与返回 1/0
- r - 如果 r 中的字符串较小,则在大字符串中搜索多个实例
- android - 找不到 com.android.tools.build:gradle:5.4.1
- java - 如何修复这个 android 项目中的这些库错误?
- c# - 返回具有特定名称的文件的 FileStreamResult 问题