Использование setTimeout для изменения порядка стека вызовов - PullRequest
0 голосов
/ 04 марта 2019

В моем веб-приложении запущена асинхронная функция, позволяющая вводить данные в чате.В другом компоненте мне нужно установить переменную для ввода и затем сосредоточиться () на ней, когда выполняются определенные условия.К сожалению, элемент DOM ввода чата не всегда доступен, когда я пытаюсь объявить его на основе асинхронного характера функции, которая его включает.Зная, как setTimeoout () работает со стеком вызовов, я обернул свою декларацию в setTimeout, и теперь все (казалось бы) работает, как и ожидалось.

Так что мой вопрос, является ли это хорошей практикой или нет?Я использую React / Redux, и мне придется много проделывать многопоточность и дополнительную логику, чтобы выполнить, казалось бы, простую задачу без setTimeout.

1 Ответ

0 голосов
/ 04 марта 2019

Это нормальная практика;)

Она выполняет свою работу, но обычно предпочтительнее работать с обратными вызовами или обещаниями, а не с опросом, чтобы увидеть, готов ли dom.Основным недостатком подхода «setTimeout» является то, что вы устанавливаете таймер и что делать, если ресурс (плагин чата) загружается дольше, чем установленный вами таймер.

// Run it
main();

// Supporting code
function main() {
    let attempts = 0;
    const maxAttempts = 10;
    tryUpdate();

    function tryUpdate() {
        // Call it once
        attempts++;
        const success = updateAndFocus();
        console.log(attempts);

        // Keep calling it every 100ms
        if (!success && attempts < maxAttempts) {
            setTimeout(() => tryUpdate(), 100);
        }
    }
}

function updateAndFocus() {
    const el = document.getElementById('findme');
    if (!el) return false;

    // do work
    el.focus;

    return true;
}
...