Почему underscore отсрочить исправить так много моих проблем?

После использования магистрали в течение нескольких недель я понял, что нижнее подчеркивание закончилось тем, что устраняло многие проблемы асинхронности, с которыми я столкнулся, в отношении рендеринга различных видов. Может кто-то, пожалуйста, помогите мне понять, что делает детерьер нижнего подчеркивания, и как он отличается от $.ready() или другого типа ожидания для отображения функций. Каковы нижние стороны его использования?

_.defer = function(func) {
    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};

Ответ 1

# These are equivalent
_.defer(fn);
setTimeout(fn, 1);

Итак, defer - это просто миллисекунда setTimeout. (Он получил еще несколько удобных функций, но они здесь не важны.)


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

Итак, что означает defer, говорит: "Запустите этот код в следующем цикле цикла".

_.defer(function() { alert('after'); });
alert('before');

Это предупреждение "before", а затем "after". Это связано с тем, что текущий цикл цикла завершает, какие предупреждения "до", а затем сразу начинается новый цикл запуска и запускает код "после".

Поэтому в любое время, когда у вас есть код прямо здесь, но вы хотите, чтобы он запускал код, который возникает после этого кода, тогда вы бы использовали defer.

_.defer(functionToRunLast);
functionToRunFirst();

Это может быть удобно с DOM. Иногда вы меняете его, но изменения не анализируются и не отображаются немедленно. В конце цикла запуска браузер догоняет и анализирует и отображает DOM, затем запускается следующий цикл запуска и может взаимодействовать с вновь созданным DOM.

(Точно, какие сценарии вызывают задержку DOM, я не уверен, но в прошлом я это заметил в своих собственных проектах.)


Это НЕ замена для DOM. Следующий цикл выполнения может произойти до того, как DOM готов к работе, не путайте эти понятия.