задержка setTimeout не работает

Я пытаюсь обернуть голову вокруг setTimeout, но я не могу заставить его работать должным образом.

Я привел пример здесь:http://jsfiddle.net/timkl/Fca2n/

Я хочу, чтобы текст отсчитывался после нажатия якоря - но мой setTimeout Кажется, срабатывает в то же время, хотя я установил задержку в 1 сек.

Это мой HTML:

<a href="#">Click me!</a>

<span id="target"></span>

Это мой JS:

$(document).ready(function() {


function foo(){

    writeNumber = $("#target");

    setTimeout(writeNumber.html("1"),1000);
    setTimeout(writeNumber.html("2"),1000);
    setTimeout(writeNumber.html("3"),1000);
    };

$('a').click(function() {
 foo();
});

});

любой намек на то, что я могу делать неправильно высоко ценится:)

7 ответов


setTimeout принимает функцию в качестве аргумента. Вы выполняете функцию и передаете результат в setTimeout (таким образом, функция выполняется сразу). Вы можете использовать анонимные функции, например:

setTimeout(function() {
    writeNumber.html("1");
}, 1000);

обратите внимание, что то же самое верно для setInterval.


вам нужно обернуть свои заявления в анонимные функции, а также пошатнуться ваши тайминги -

setTimeout(function(){writeNumber.html("1")},1000);
setTimeout(function(){writeNumber.html("2")},2000);
setTimeout(function(){writeNumber.html("3")},3000);

если вы установите все в 1000 шаги будут в значительной степени выполняться одновременно как setTimeout функция будет запускать задачу через 1 секунду после вызова функции не через 1 секунду после предыдущего вызова


вам нужно использовать функцию ссылка вызывается позже, когда таймер истекает. Оберните каждый оператор в анонимную функцию, чтобы он выполнялся не сразу, а по истечении таймера.

setTimeout(function() { writeNumber.html("1"); },1000);

кроме того, вы хотите использовать другое значение задержки для каждого из них, чтобы таймеры не истекали одновременно. См. обновленную скрипку вhttp://jsfiddle.net/RqCqM/


существует положение для передачи аргументов функции. В вашем случае, вы можете сделать это

setTimeout(writeNumber.html,1000,1);
setTimeout(writeNumber.html,1000,2);
setTimeout(writeNumber.html,1000,3);

третий аргумент функции setTimeout будет передан в writeNumber.функция html


просто использовать setInterval(). здесьвот что я придумал. Вот ваш новый javascript:

function foo(){
    writeNumber = $("#target");
    number      = 0;
    writeNumber.html(number);
    setInterval(function(){
        number = number+1;
        writeNumber.html(number);
    },1000);
    };
$('a').click(function() {
 foo();
});

вам нужно использовать функции, которые будут вызываться после истечения тайм-аута; вы также можете использовать анонимную функцию, тогда ваша функция foo будет выглядеть так:

function foo(){

writeNumber = $("#target");

setTimeout(function() { writeNumber.html("1"); },1000);
setTimeout(function() { writeNumber.html("2"); },1000);
setTimeout(function() { writeNumber.html("3"); },1000);

};

Я приземлился на этот вопрос. На него ответили адекватно, и я думаю, используя setInterval как предложил @Purag, вероятно, лучший подход для получения желаемого функционального поведения. Однако в исходном примере кода асинхронное поведение JavaScript не учитывалось. Это часто встречающаяся ошибка, которую я сделал сам не раз :).

Итак, в качестве примечания я хотел дать другое возможное решение для этого, которое имитирует первоначальную попытку, но это время не рассматривает Asynchronousity в JavaScript:

setTimeout(function() {
    writeNumber.html("1");
    setTimeout(function() {
        writeNumber.html("1");
        setTimeout(function() {
            writeNumber.html("1");
        }, 1000);
    }, 1000);
}, 1000);

сейчас, конечно, это явно ужасный код!

Я дал рабочий JSFiddle этого в мой такой же вопрос. Этот код иллюстрирует так называемый пирамида судьбы. И это можно смягчить с помощью обещаний JavaScript, как показано в ответах на мой вопрос. Требуется некоторая работа, чтобы написать версию WriteNumber() это использует обещания, но тогда код можно переписать на что-то вроде:

writeNumAsync(0)
    .then(writeNumAsync)
    .then(writeNumAsync)
    .then(writeNumAsync);