Как сделать так, чтобы мой основной цикл "останавливался", пока игрок не дал ответ, используя кран, а затем продолжил?
Разбив его.Единственный «выход» в JavaScript в браузерах - это позволить вашей функции завершиться и затем организовать обратный вызов позже (через setTimeout
, setInterval
, обратный вызов ajax и т. Д.).В вашем случае я склонен думать, что триггером для вашего обратного вызова должно быть действие пользователя, отвечающее на предыдущий вопрос, например, обработчик click
в полях ответов или что-то подобное (вместо setTimeout
и тому подобное, котороеавтоматизированы).
Например, этот код:
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();
}
}
}
Вторая версия возвращает управление обратнобраузер на каждой итерации цикла.Также важно отметить, что вторая версия возвращает до того, как циклы были завершены, тогда как первая версия ждет, пока все циклы не будут выполнены, поэтому вторая версия имеет 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();
});
Делая это, вы, вероятно, обнаружите, что используете замыкания (loop
, выше, это замыкание), и поэтому эта статья может быть полезна: Затворы не сложны