В настоящее время существует 2 различных API, направленных на разбиение задач на запланированные функции обратного вызова.
Насколько мне известно, не существует среды выполнения JavaScript (браузер или узел), которая в настоящее время реализует обе функции.
Я хотел бы лучше понять, как сравниваются эти две функции. Я понимаю, что requestIdleCallback имеет параметр timeout, который можно использовать, чтобы позволить браузеру решать, когда его вызывать, и передает объект IdleDeadline в обратный вызов, где setImmediate передал любые предоставленные аргументы, но чем отличаются эти API?
Например, являются ли следующие два примера функционально идентичными?
setImmediate(function() {
// Do something.
});
requestIdleCallback(function() {
// Do something.
}, {timeout: 0});
Как насчет случая, когда зарегистрировано несколько обратных вызовов, но первый работает дольше времени простоя?
@JaromandaX Вы имеете в виду, что они больше похожи на безtimeout: 0? Это кажется нелогичным. Также не забывайте Node, у которого есть только setImmediate.
Я бы сказал, что setImmediate действительно странный, если вы действительно хотите быть Immediate, почему бы просто не выполнить его?
re node - да, но вы сказали there are no browsers which currently implement both features - что предполагает, что вы даже не заботитесь об узле - и давайте посмотрим правде в глаза, если идея состоит в том, чтобы использовать два метода по мере необходимости для достижения одного и того же результата во всех браузерах, то, что делает node, это не имеющий отношения
@appleapple Да, имя плохое (не знаю, как это имя было выбрано). На самом деле я не хочу "немедленно" столько, сколько в следующий раз.
Хммм, интересно, может все-таки больше похоже на timeout:0
Также может быть Предложение asap.
Я думаю, проблема в том, как среда выполнения думает, что это праздный. Есть формальное определение?
@appleapple Не уверен насчет «формального определения», но в браузере оно будет относиться ко времени в цикле событий, где в противном случае ему нечего было бы делать.
Я не уверен. например если функция должна быть выполнена только в следующем кадре, остается ли это праздный?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


setTimeout подождет некоторое время, а затем выполнит обратный вызов.
requestIdleCallback будет ждать, пока основной поток будет бездействовать, прежде чем выполнять обратный вызов. Это означает, что это не будет замедлять анимацию, пользователь по-прежнему может нажимать кнопки и вводить данные.
Как выбрать между setTimeout и requestIdleCallback? setTimeout лучше всего использовать, когда должен выполняться обратный вызов (пример: отправка данных на сервер аналитики или выход пользователя из системы). requestIdleCallback лучше всего подходит, когда вы не хотите навредить пользовательскому опыту стоимостью выполнения обратного вызова (пример: повторная визуализация DOM).
Имейте в виду, что requestIdleCallback все еще является экспериментальным.
Я бы подумал, что без
, {timeout: 0}эти два почти идентичны, насколько вы можете надеяться - что касается вашего последнего вопроса - я сомневаюсь, что они идентичны по функциональности - но кого действительно волнуют Internet exploder и Edge