我在firestore有一些东西。我想按顺序显示它们,但以随机序列显示。所以,我做了以下代码。这里我想显示一个特定的问题,然后当点击“下一步”按钮时,我想显示下一个项目。在这里,在forEach循环中,我将项目渲染到renderQuestion函数。他们正在使用HTML和CSS在前端显示它们。
但是我正在获取这个问题,他们一直显示所有内容,直到循环结束。他们不会等待按下“下一步”按钮。那么,我该怎么解决这个问题呢?我是新来的,如果我已经做错了什么,请原谅我。
renderQuestion = (qID, roomID) => {
q.innerHTML = qID.data().question;
ans1.innerHTML = qID.data().a;
ans2.innerHTML = qID.data().b;
ans3.innerHTML = qID.data().c;
ans4.innerHTML = qID.data().d;
/* next.addEventListener("click", (e) => { //not working
e.preventDefault();
console.log("done");
}); */
};
runningExam = async (review) => {
const totalQ = review.data().total_questions;
let arr = [];
for (let i = 0; i <= totalQ; i++) {
arr.push(false);
}
let n = totalQ;
while (n) {
let randomNumber = getRandom(totalQ);
if (!arr[randomNumber]) {
arr[randomNumber] = true;
await db
.collection("examrooms")
.doc(review.id)
.collection("questions")
.where("serial", "==", randomNumber)
.get()
.then((snapshot) => {
snapshot.docs.forEach((doc) => {
renderQuestion(doc, review);
});
});
n--;
}
}
};
看起来您正试图阻止runningExam
函数,直到用户按下按钮。我找到了另一个线程来实现这一点。
基本上,将renderQuestion
函数转换为异步函数,并在每次调用时等待用户输入。
renderQuestion = async (qID, roomID) => {
const timeout = async ms => new Promise(res => setTimeout(res, ms));
let userClicked = false;
q.innerHTML = qID.data().question;
ans1.innerHTML = qID.data().a;
ans2.innerHTML = qID.data().b;
ans3.innerHTML = qID.data().c;
ans4.innerHTML = qID.data().d;
next.addEventListener("click", (e) => {
userClicked = true;
e.preventDefault();
console.log("done");
});
while (userClicked === false) await timeout(50);
};
在运行考试中
:
then( async (snapshot) => {
for(let doc of snapshot.docs) {
await renderQuestion(doc, review);
};
});
可能有更好的方法来编程这项任务,这只是一个可能的方法来做它的方式,你试图。
我有一个HTML格式的表,显示关于产品的数据。好吧,在这个表中我想添加一个按钮,允许用户在愿意的情况下删除该产品,该按钮将通过JavaScript与表中的信息一起自动生成。 没有信息的表应该如下所示: 在JavaScript中,我有一个函数可以处理这个表,一个用来添加空行,另一个用来添加信息,包括delete按钮。 其余的代码没有太大的关系,以至于有变量和函数的名字,我没有给出细节。对我来说最重要
问题内容: Javascript中的“ for…in”循环是否按声明的顺序遍历哈希表/元素?有没有按顺序执行的浏览器? 我希望使用的对象将被声明 一次, 并且永远不会被修改。 假设我有: 我进一步将它们用于: 我是否可以期望在大多数体面的浏览器中,“ A:“ Hello””总是排在“ B:“ World””之前? 问题答案: 当前,所有主流浏览器都按照定义它们的顺序遍历对象的属性。Chrome可以
有人能帮忙吗?我正在尝试获取代表动态生成的智能卡(例如633597015500042010)的按钮的最后一个xpath元素,然后单击它。我尝试了以下方法,但仍然找不到解决方法。我打算捕获的按钮的名称是“Select”。 driver.findElement(by.xpath(“//div[@class='select-item']/div)[last()]”).click();
我的问题得到了回答,我的问题得到了解决。我已经更新了这个线程与我的最终解决方案 我正在做这个学校作业(测验程序),我们最初只需要做一个纯粹的基于文本的控制台游戏,但我想挑战自己,试着用JavaFX创建它,我们刚刚开始学习。 这是一个基于回合的问答游戏,玩家将被呈现一个问题,要求玩家通过两个按钮(对或错按钮)回答对/错 游戏流程: 我正在运行一个for循环,只要我的ArrayList中还有问题,这个
问题内容: 我想在循环内添加延迟/睡眠: 我这样尝试过: 只有第一种情况是正确的:显示后,它将等待3秒钟,然后显示,但随后将不断重复。 我想要的是在显示3秒之后显示出来,然后它需要第二次等待3秒,依此类推。 问题答案: 该函数是非阻塞的,将立即返回。因此,您的循环将非常快速地迭代,并且将快速连续地发起3秒超时触发。这就是为什么您的第一个警报会在3秒钟后弹出,而其余所有警报都将连续不断地出现。 您可
问题内容: 我的网站上有一个jqgrid(版本3.5.3),它是通过对Web服务的Ajax调用获取结果的。查询通常很复杂,加载结果需要花费几秒钟的时间。加载时,用户会看到一个框[Loading …]。 如果用户意识到他们在搜索错误的内容,则客户端要求向网格添加一个取消按钮,这将: 使网格忘记刚刚请求的数据 保留先前搜索中已加载的结果 似乎没有内置任何功能,因此我可能正在寻找一些技巧来实现这一目标。