Меня смущает поведение Promise в JavaScript, и у меня есть вопросы. Может ли кто-нибудь помочь мне разобраться в них?
Это два распространенных способа создания обещания.
function promise(){
return new Promise((resolve, reject) => {
resolve()});
}
let promise = new Promise(function(resolve, reject){
resolve();
});
Первая функция создает объект Promise, но не вызывает его, пока мы не вызовем функцию. Для сравнения, второй оператор создает объект Promise и немедленно вызывает его. Я прав?
Для этой функции:
function timeout(ms){
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done');
});
}
timeout(100).then((value) => {
console.info(value);
});
Я думаю, что когда мы вызываем функцию тайм-аута, она сначала создает асинхронную функцию setTimeout и помещает ее в конец очереди событий. После завершения всех синхронных событий он будет вызван и создаст объект Promise. Объект Promise также будет помещен в конец очереди событий, после других синхронных событий. Итак, кажется, есть два цикла событий, я прав?
Равны ли эти два утверждения?
let promise = new Promise(function(resolve, reject){
resolve();
});
let promise = Promise.resolve();
Почему выходная последовательность выглядит следующим образом?
setTimeout(function(){
console.info('3');
}, 0);
Promise.resolve().then(function(){
console.info('2');
});
console.info('1');
// 1
// 2
// 3
Это пример из книги, автор объясняет следующее: setTimeout(fn, 0) будет вызываться в начале следующего цикла событий, Promise.resolve() будет вызываться в конце текущего цикла событий, а console.info() будет вызван немедленно.
Меня смущает, почему функция setTimeout будет вызываться в начале следующего цикла событий. Я думаю, что это также асинхронная функция, и она будет помещена в конец текущей очереди событий, поэтому ее следует вызывать перед объектом Promise. Может кто-нибудь сказать мне, почему я ошибаюсь.
да, нет, да, очереди событий больше одной (одна для «задач» и одна для «микротаз», одна nodejs их и того больше)
setTimeout(fn, 0); на самом деле является setTimeout(fn, 10); setTimeout не поддерживает таймауты менее 10 мс + это не "вызвать fn через 10 мс", а скорее "позвоните fn, как только у вас будет время не менее чем через 10 мс"Возможный дубликат Разница между микрозадачей и макрозадачей в контексте цикла событий



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


если вы используете новое обещание, это означает, что вы вызываете конструктор, который будет выполняться первым, когда будет определен тип данных, и когда вы определили обещание как функцию, вам нужно его вызвать
Филип Робертс не говорит в своем видео о микрозадачах, которые являются причиной «странного поведения» в 4-м примере.
Что касается 1), экземпляр Promise создается при вызове
new Promise(). Первый способ создает функцию, которая будет делать это при вызове, второй способ просто напрямую создает Promise. Этот факт не имеет ничего общего с тем, как работают обещания, то же верно и дляnew Date().