JavaScript暂停函数的执行以等待用户输入

JavaScript暂停函数的执行以等待用户输入,javascript,pausing-execution,Javascript,Pausing Execution,我正在尝试使用HTML5画布、JavaScript和XML制作一种游戏。 其思想是,您可以通过将问题和答案放入XML文件中来进行测验。 我写了一个主循环,循环所有问题,提出它们并检查答案的正确性。 现在,我只是简单地使用提醒和对话框来回答问题 问题是,我的主循环是一个大的相互关联的整体,从开始到结束贯穿整个游戏,而不是让提出问题的警告框和要回答的对话框,一个接一个,我想要一些用户交互。 问题的答案显示在屏幕底部的框中,用户可以控制起重机来选择正确的答案。 下面是我一直坚持的主循环中的代码片段:

我正在尝试使用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:很高兴这有帮助。是的,我还要看看更大的结构。:-)你在这方面绝对是对的。回顾我的代码,最初的单循环对于初始测试来说是很好的,但我想我最好还是把它扔掉,让它像你说的那样更事件驱动。感谢你的明确解释,如果我有这样做的名声,我会投票支持你的答案的有用性:)你的英语其实相当好,如果你没有告诉我,我不会知道。