setTimeout внутри для цикла [дубликат]

Я в основном соглашаюсь с Mitchel, что это может быть очень конкретно в зависимости от того, что является Вами собирающийся делать с XML/sqlite. Для Вашего случая (кэш) мне кажется, что использование sqlite (или другой встроенный dbs) имеет больше смысла.

Первый я действительно не думаю, что sqlite будет нужно больше служебное, чем XML. И я имею в виду и время разработки наверху и время выполнения наверху. Только проблема состоит в том, что у Вас есть зависимость от sqlite библиотеки. Но так как Вам была бы нужна некоторая библиотека для XML так или иначе, это не имеет значения (я предполагаю, что проект находится в C/C++).

Преимущества sqlite по xml:

  • все в одном файле,
  • потеря производительности ниже, чем XML, поскольку кэш становится больше,
  • можно разделить метаданные канала от самого кэша (другая таблица), но доступный таким же образом,
  • SQL, вероятно, легче работать с, чем XPath для большинства людей.

Недостатки sqlite:

  • может быть проблематичным с несколькими процессами, получающими доступ к той же базе данных (вероятно, не Ваш случай),
  • необходимо знать, по крайней мере, основной SQL. Если не будут сотни тысяч объектов в кэше, я не думаю, что необходимо будет оптимизировать его очень,
  • , возможно, в некотором роде это может быть более опасно с точки зрения безопасности (Внедрение SQL). С другой стороны, Вы не кодируете веб-приложение, таким образом, этого не должно происходить.

Другие вещи на одном уровне для обоих решений, вероятно.

Для подведения его, отвечает на вопросы соответственно:

  1. Вы не будете знать, если Вы не протестируете свое определенное приложение с обоими бэкендами. Иначе это - всегда просто предположение. Основная поддержка обоих кэшей не должна быть проблемой кодировать. Тогда сравните и сравните.

  2. из-за пути XML-файлы организованы, sqlite поиски должно всегда быть быстрее (запрещающий некоторые угловые случаи, где он не имеет значения так или иначе, потому что это ослепительно быстро). Ускорение поисков в XML потребовало бы индексной базы данных так или иначе в Вашем случае, который будет означать иметь кэш для кэша, не особенно хорошую идею. Но с sqlite у Вас может быть индексация как часть базы данных.

16
задан richard 21 November 2009 в 20:33
поделиться

5 ответов

Попробуйте что-то вроде этого:

function initText()
{
    var textScroller = document.getElementById('textScroller');
    var text = 'Hello how are you?';

    var c = 0;
    var interval = setInterval(function() { 
                          textScroller.innerHTML += text[c]; 
                          c++; 
                          if(c >= text.length) clearInterval(interval);
                   }, 1000);

}

Обратите внимание, что я добавил clearInterval , чтобы остановить его, когда это необходимо.

35
ответ дан 30 November 2019 в 15:56
поделиться

В настоящее время вы определяете 18 тайм-аутов, и все они будут выполнены ~ одновременно. Вторая проблема заключается в том, что вы передаете инструкции для выполнения в виде строки. В этом случае у кода не будет доступа ко всем переменным, определенным в initText, потому что оцененный код будет выполняться в глобальной области.

IMO, это должно выполнить работу

function initText(){
    var textScroller = document.getElementById('textScroller');
    var text = 'Hello how are you?';

    var c = 0;

    (function(){
        textScroller.innerHTML += text.charAt(c++);
        if(text.length > c){
            setTimeout(arguments.callee, 1000);
        }
    })();
}
4
ответ дан 30 November 2019 в 15:56
поделиться

Попробуйте следующее:

function initText()
{
    var textScroller = document.getElementById('textScroller');
    var text = 'Hello how are you?';

for(c = 0; c < text.length; c++)
{
    setTimeout("textScroller.innerHTML += '" + text[c] + "'", 1000 + c*200);
}
}

window.onload = initText;
2
ответ дан 30 November 2019 в 15:56
поделиться

Попробуйте использовать закрытие:

function init() {
    var textScroller = document.getElementById('textScroller');
    var text = 'Hello how are you?';
    var c = 0;
    function run() {
        textScroller.innerHTML += text[c++];
        if (c<text.length)
            setTimeout(run, 1000);
    }
    setTimeout(run, 1000);
}
init()

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

1
ответ дан 30 November 2019 в 15:56
поделиться

Цикл for устанавливает тайм-аут для каждого символа сразу, поэтому они будут отображаться не последовательно, а все сразу. Ваш setTimeout должен включать код для другого setTimeout, который будет включать следующий символ для отображения.

Примерно так (не тестировал)

function initText()
{
    var textScroller = document.getElementById('textScroller');
    var text = 'Hello how are you?';    
    setTimeout('nextChar(text)', 1000);
}
function nextChar(text){
    if(text.length > 0){
        textScroller.innerHTML += text[0]; 
        setTimeout('nextChar(text.substring(1))', 1000);
    }
}
0
ответ дан 30 November 2019 в 15:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: