JavaScript暂停函数的执行以等待用户输入
我正在尝试使用HTML5画布、JavaScript和XML制作一种游戏。 其思想是,您可以通过将问题和答案放入XML文件中来进行测验。 我写了一个主循环,循环所有问题,提出它们并检查答案的正确性。 现在,我只是简单地使用提醒和对话框来回答问题 问题是,我的主循环是一个大的相互关联的整体,从开始到结束贯穿整个游戏,而不是让提出问题的警告框和要回答的对话框,一个接一个,我想要一些用户交互。 问题的答案显示在屏幕底部的框中,用户可以控制起重机来选择正确的答案。 下面是我一直坚持的主循环中的代码片段:JavaScript暂停函数的执行以等待用户输入,javascript,pausing-execution,Javascript,Pausing Execution,我正在尝试使用HTML5画布、JavaScript和XML制作一种游戏。 其思想是,您可以通过将问题和答案放入XML文件中来进行测验。 我写了一个主循环,循环所有问题,提出它们并检查答案的正确性。 现在,我只是简单地使用提醒和对话框来回答问题 问题是,我的主循环是一个大的相互关联的整体,从开始到结束贯穿整个游戏,而不是让提出问题的警告框和要回答的对话框,一个接一个,我想要一些用户交互。 问题的答案显示在屏幕底部的框中,用户可以控制起重机来选择正确的答案。 下面是我一直坚持的主循环中的代码片段:
answer = loadQuestion(i);
if (answer == "correct") {
// answered correctly, update scoreArray and load next question
scoreArray[currentQuestion] = "correct";
// show 'next'-button and wait for press to continue
} else {
// answered incorrectly again, update scoreArray and load next question
scoreArray[currentQuestion] = "error";
// show 'next'-button and wait for press to continue
}
如您所见,我正在调用loadQuestion,它会立即加载问题,显示可能的答案,并且现在会立即抛出一个对话框,您可以在其中键入答案。
此答案将被返回并验证
我已经对起重机的控制进行了编程,用户可以用它捡起一个箱子。
但因为我调用loadQuestion并希望它返回一个值,所以这不起作用。
如何使主循环“暂停”,直到使用起重机的玩家给出答案,然后继续?
我已经尝试将答案设置为全局变量,并且只使用一个空while answer==“”使函数在答案获得值之前不做任何事情,但这只是冻结了脚本。
我还尝试使用interval来监视answer变量的状态,清除interval并在发生这种情况时返回值,但这只是返回false,因为函数完成后没有立即返回值
如何使主循环“暂停”,直到使用起重机的玩家给出答案,然后继续
把它拆开。浏览器上JavaScript的唯一“收益”是让函数结束,然后安排稍后再调用(通过setTimeout
、setInterval
、ajax回调等)。在您的情况下,我倾向于认为回电的触发因素应该是用户回答前面问题的动作,例如,回答框上的单击处理程序或诸如此类(而不是设置超时
等,这些都是自动的)
例如,此代码:
function loopArray(ar) {
var index;
for (index = 0; index < ar.length; ++index) {
doSomething(ar[index]);
}
}
…而使用异步版本的情况如下所示:
function loopArrayAsync(ar, callback) {
var index;
index = 0;
loop();
function loop() {
if (index < ar.length) {
doSomething(ar[index++]);
setTimeout(loop, 0);
}
else {
callback();
}
}
}
var a = ["one", "two", "three"];
loopArray(a);
// Code that expects the loop to be complete:
doTheNextThing();
doYetAnotherThing();
var a = ["one", "two", "three"];
loopArrayAsync(a, function() {
// Code that expects the loop to be complete:
doTheNextThing();
doYetAnotherThing();
});
这样做,您可能会发现您使用了(循环,上面是一个闭包),因此本文可能很有用:没有同步。浏览器JS中暂停的输入/输出工具,除了警报
、确认
和提示
。由于您不想使用这些,请尝试以下模式:
loadQuestion(i, function(answer) {
if (answer == "correct") {
// answered correctly, update scoreArray and load next question
scoreArray[currentQuestion] = "correct";
// show 'next'-button and wait for press to continue
} else {
// answered incorrectly again, update scoreArray and load next question
scoreArray[currentQuestion] = "error";
// show 'next'-button and wait for press to continue
}
resumeGameExecution();
});
也就是说,当用户回答时,回调函数被执行,你知道你可以开始了。据我所知,你有一个调查问卷应用程序,在这个应用程序中,你会问一系列问题,然后让用户使用一些拖放控件(起重机)放下他的答案
我要说的是,设计似乎是错误的。Javascript是基于事件的,让一个主线程循环用于用户交互将降低可用性。我不会使用任何方式来暂停线程(在java中称为暂停)。Javascript不是为这种用例编写的。某些浏览器和几乎所有性能分析器(如Yslow)都会认为您的应用程序没有响应
因此,我将为每个问题提供一个div,该div由一个类标识,该类内部是一个序列(问题1..2)。最初只会启用或显示一个问题。用户回答问题后,我将启用启用的问题。(在适当的事件中,在这种情况下可能是拖放事件)。因为它是顺序的,我只需要检查用户是否回答了问题1,然后我将适当地启用问题2。整个流程应该是事件驱动的。这里的事件是用户回答问题。@Diodeus:哦,你知道他们说什么,“过去的性能不能保证未来的结果”……谢谢你的回答,我仍然是一个JavaScripter新手,我以前从未使用过回调函数。感谢您的清晰解释和示例代码:)您得到了公认的答案,因为这回答了我最初的问题。“doc_180也是对的,不过,我想我最好回到绘图桌上重新思考一下。”@Jort:很高兴这有帮助。是的,我还要看看更大的结构。:-)你在这方面绝对是对的。回顾我的代码,最初的单循环对于初始测试来说是很好的,但我想我最好还是把它扔掉,让它像你说的那样更事件驱动。感谢你的明确解释,如果我有这样做的名声,我会投票支持你的答案的有用性:)你的英语其实相当好,如果你没有告诉我,我不会知道。