2012-03-12 7 views
0

Следующий javascript отображает окончательный результат (вместо обновления каждую секунду). Как я могу повторить результат вызова getJSON, отобразить этот результат и задержать, пока не отображу следующий элемент?jquery display + стратегия задержки

function display(state) { 
    for (var i=0; i < state.length; i++) { 
    $('#someDiv' + i).text(state[i]); 
    } 
} 

$.getJSON('/getdata', function(data) { 
    $.each(data, function(key, val) { 
    setTimeout(function(){display(val)}, 1000); 
    }); 
} 
+1

Использование 'SetTimeout '. Потеряйте эту отвратительную функцию 'sleep'. –

+0

Я откат вашего редактирования, потому что нецелесообразно заменить нерабочий код из исходного вопроса на решение. Если у вас есть решение, которым вы довольны, это отличается от уже опубликованных ответов, а затем отправляйте его как ответ самостоятельно и принимайте его. (В противном случае ваш вопрос не имеет смысла, потому что он спрашивает, что не так с кодом, в котором нет ничего плохого.) – nnnnnn

+0

Собственно, даже его пересмотренная версия просто сделает все дисплеи сразу через 1 секунду. – GoldenNewby

ответ

1

Проблема заключается в том, что в вашем $.each() цикле вы в очереди все время ожидания сразу, все для 1000ms после цикла. Самый простой способ исправить это выглядит следующим образом:

$.getJSON('/getdata', function(data) { 
    $.each(data, function(key, val) { 
    setTimeout(function(){display(val)}, 1000 * key); 
    }); 
}); 

Отмечая, что это будет работать только если data массив и, таким образом, key является целочисленным индексом. Если data является объектом и key не целочисленный индекс вы могли бы сделать это:

$.getJSON('/getdata', function(data) { 
    var i = 0; 
    $.each(data, function(key, val) { 
    setTimeout(function(){display(val)}, 1000 * i++); 
    }); 
}); 

(. Установите i в 1 первоначально, если вы не хотите, первое обновление произойдет немедленно)