Печать на массиве элементов экрана с задержкой / повторением их с помощью функции обратного вызова Javascript
Я пытаюсь напечатать заданные ячейки массива с задержкой 2 секунды для каждого элемента между каждой печатью, используя функцию обратного вызова, но я не могу заставить ее работать. Вместо этого он печатает их все вместе через 2 секунды
вот код:
var words = ["horse","pig","fish","lion"]
var time
function display(callback){
time = setTimeout(typing, 2000);
}
function typing(){
for (var i=0; i<words.length; i++)
document.write(words[i])
}
display(typing);
Я мог бы также использовать некоторую помощь с этим кодом, если это возможно. Если первая переменная (в данном случае a) - это число, а вторая переменная (в данном случае b) - это строка, она должна вывести строку столько раз, сколько и номер переменной a. Этот не работает вообще:/
вот код:
function display(callback) {
time = setTimeout(typing, 1000)
}
function typing(a,b) {
var aInput = prompt("Please enter a input");
aInput = a
var bInput = prompt("Please enter b input");
bInput = b
if (a === int)
for (i=0; i<a.length; i++)
alert(b)
else
alert("Not valid Input")
}
display(typing);
заранее большое спасибо за огромную помощь, которую это сообщество оказывает начинающим:)
3 ответа
Чтобы ответить на ваш первый вопрос. Все слова печатаются через 2 секунды, потому что цикл for не ждет с каждым циклом до выполнения setTimeout
закончен, поэтому он запускает все setTimeout
s почти мгновенно, и каждый из них ждет 2 секунды, по-видимому, заканчивая в то же время. Вы можете изменить это так.
var words = ["horse","pig","fish","lion"]
function display() {
let counter = 0;
const interval = setInterval(() => {
document.write(words[counter++]);
if (counter === words.length) {
clearInterval(interval);
}
}, 2000);
}
display();
Что касается второй проблемы. Это можно решить аналогичным образом.
function display(a, b) {
// if a and b were passed to the function use those
// otherwise ask for them by prompting the user
let aInput = a || prompt('Please enter a input');
let bInput = b || prompt('Please enter b input');
// check if a is valid integer (could also use Math.floor if floats are valid in your case as well)
if (!isNaN(parseInt(a))) {
let counter = 0;
const interval = setInterval(() => {
alert(b);
counter++;
if (counter >= parseInt(a)) {
clearInterval(interval);
}
}, 2000);
} else {
alert('Not a valid input');
}
}
display(4, 'a');
Есть несколько вещей не так со вторым кодом:
- Вы принимаете участие через
prompt
так что вам не нужно передавать аргументыtyping
, - По вышеуказанной причине a и b не определены. Так,
aInput = a
а такжеbInput = b
не имеет смысла. Вместо этого сохраните значения aInput и bInput в a и b соответственно. if (a === int)
неправильный синтаксис. В JavaScript нет такой вещи как int. Если вы хотите проверить, является ли номер, используйтеisNaN(a)
,for loop
в пределахif-statement
должен быть заключен в {}, поскольку он содержит более одной строки.
Это должно работать нормально:
function display(callback) {
time = setTimeout(typing, 1000)
}
function typing() {
var aInput = prompt("Please enter a input");
var a = Number(aInput);
var bInput = prompt("Please enter b input");
var b = bInput;
if (!isNaN(a)){
for (var i=0; i<a; i++){
alert(b);
}
}
else {
alert("Not valid Input")
}
}
display(typing);
Судя по всему, вы должны делать эту часть:
var aInput = prompt("Please enter a input");
aInput = a
var bInput = prompt("Please enter b input");
bInput = b
до:
time = setTimeout(typing, 1000)
а затем отправив ваши параметры a и b по адресу:
typing(a,b)
Если вы делаете это таким образом, это должно работать.