Обещание вопрос интервью

интервью внешний интерфейс JavaScript Promise

Оригинальный адрес: 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 выполняется немедленно, эта тема кажется очень простой.