Оригинальный адрес: https://github.com/lzlu/Blog/issues/7
Эта статья не имеет ничего общего, а просто дает ответ на вопрос интервью.
Я встречал этот вопрос в интервью раньше и не ответил на него правильно. Хотя такого рода тема, похоже, не имеет практического значения для написания кода, в конечном счете, у меня все еще нет глубокого понимания механизма выполнения JS.
Устраните эту проблему и поделитесь с вами некоторыми идеями по ее решению. Если вы недостаточно знаете о механизме выполнения JS, сначала прочтите этоНа этот раз досконально разберитесь в механизме выполнения JavaScript - Требуется программист, а потом есть.
Нечего сказать, квашеная капуста, о нет, тема.
const first = () => (new Promise((resolve,reject)=>{
console.log(3);
let p = new Promise((resolve, reject)=>{
console.log(7);
setTimeout(()=>{
console.log(5);
resolve(6);
},0)
resolve(1);
});
resolve(2);
p.then((arg)=>{
console.log(arg);
});
}));
first().then((arg)=>{
console.log(arg);
});
console.log(4);
Первый раунд цикла событий
выполнить первымзадача макроса, основной скрипт, новый промис выполняется немедленно, вывод [3], выполняется новая операция промиса p, вывод [7], setTimeout найден, и обратный вызов помещается в следующий раунд очереди задач (Очередь событий), затем p, назовем его then1, поместить вочередь микрозадач, найдите then of first, называемый then2, вставьте его вочередь микрозадач. Выполните console.log(4), выведите [4], и выполнение задачи макроса завершится.
повторно выполнитьмикрозадачи, выполнить then1, вывести [1], выполнить then2, вывести [2]. В этот момент заканчивается первый раунд цикла событий. Начать второй раунд.
Второй раунд цикла событий
выполнить первымзадача макросаВнутренняя часть, то есть обратный вызов setTimeout, выводит [5]. resovle не вступит в силу, потому что состояние Promise p не изменится после его изменения. Таким образом, окончательный порядок вывода — 3, 7, 4, 1, 2, 5.
Суммировать
Зная механизм выполнения JavaScript и зная, что конструктор Promise выполняется немедленно, эта тема кажется очень простой.