зачем писать эту статью
- Это вопрос, который любят задавать как крупные, так и мелкие заводские интервьюеры.
- Многие интервьюеры и интервьюируемые не знают, что такое стандартный ответ
- Разные статьи в интернете разного уровня.. многих ввели в заблуждение, в том числе и меня
- Думаю, сегодня лучше потратить десять минут на то, чтобы ясно ему объяснить.
Официально начать
- код сначала
function app() {
setTimeout(() => {
console.log("1-1");
Promise.resolve().then(() => {
console.log("2-1");
});
});
console.log("1-2");
Promise.resolve().then(() => {
console.log("1-3");
setTimeout(() => {
console.log("3-1");
});
});
}
app();
- Выходной результат:
1-2
1-3
1-1
2-1
3-1
начать анализ
- Интервьюеры любят спрашивать: что такое микрозадачи и макрозадачи?
Большинство интервьюеров на самом деле не знают, что такое микрозадачи и макрозадачи Если вы мне не верите, пожалуйста, спросите в следующий раз.
так называемые микрозадачи и макрозадачи
- Макро-задачи: общие таймеры, события взаимодействия с пользователем и т. д. (макро-задачи — это конкретные задачи, не имеющие особого значения)
- Микрозадачи:
Promiseсопутствующие задачи,MutationObserverждать (то же самое,只是一种称呼而已!!!)
Выполнять сначала микрозадачи или макрозадачи
- Что появилось раньше, курица или яйцо, макрозадача или микрозадача?
первый принцип
- Все готово к выходу из глобального контекста, и начинается отсчет времени окончания кода глобальной синхронизации
- Например, у нас только что был такой код:
function app() {
setTimeout(() => {
console.log("1-1");
Promise.resolve().then(() => {
console.log("2-1");
});
});
console.log("1-2");
Promise.resolve().then(() => {
console.log("1-3");
setTimeout(() => {
console.log("3-1");
});
});
}
app();
- при исполнении
console.log("1-2");Когда , это означает, что глобальный контекст вот-вот выйдет, потому что в это время глобальный синхронный код был выполнен, а остальное — асинхронный код
второй принцип
- на том же уровне(
不理解层级,可以先不管,后面会讲), микрозадачи всегда выполняются перед макрозадачами - То есть Promise.then выполняется до setTimeout.
- так сначала напечатай
1-3, распечатать снова1-1
третий принцип
- Каждая макрозадача индивидуально связана с очередью микрозадач.
- Я нарисовал картину только что купленной доской, и все знают, что такое иерархия.
- Макрозадачи каждого уровня соответствуют своим очередям микрозадач, которые следуют принципу «первым пришел — первым вышел». Микрозадачи одного уровня всегда будут выполняться перед макрозадачами, и все они будут выполняться до окончания макрозадачи текущего уровня.
Как различать уровни?
- Коды, принадлежащие одному и тому же измерению, такие как следующие
func1和func2задачи одного уровня
setTimeout(func1)...
Promise.resolve().then(func2)...
- последующий
fn1和fn2Она не принадлежит к тому же уровню, потому что fn2 принадлежит внутреннемуsetTimeoutочередь микрозадач, аfn1принадлежать снаружиsetTimeoutочередь микрозадач
setTimeout(()=>{
Promise.resolve().then(fn1)
setTimeout(()=>{
Promise.resolve().then(fn2)
})})
Фокус: каждой макрозадаче соответствует отдельная очередь микрозадач
столкнуться с вопросами интервью
- Просто следуйте моей процедуре, перед выходом из глобального контекста (после выполнения кода глобальной синхронизации) начните собирать микрозадачи и макрозадачи текущего уровня, а затем сначала очистите очередь микрозадач, а затем выполните макрозадачу.Если вы столкнулись с макрозадачами в этот период /Микро задания, просто нарисуй картинку как я и поставь на соответствующий уровень
напиши в конце
- Простые 1000 слов, я считаю, что они могут полностью решить ваши сомнения относительно микро- и макрозадач.
- Если вы хотите понять глубже, не забудьте обратить внимание на [
前端巅峰] Официальный аккаунт, в продолжении я напишу более подробные вещи, действительно "объясню глубокие вещи простым языком"