resolve(async2());
вкратце совпадает с:
resolve(Promise.resolve())
Таким образом, он создает Обещание, которое разрешит, и передает его на разрешение другого Обещания. По мере того, как обещания сглаживаются (решение обещания с помощью обещания заставит внешнее обещание ждать внутреннего), ваши примеры могут быть упрощены до:
Promise.resolve("first").then(console.log);
Promise.resolve("second")
.then(it => it)
.then(console.log);
Теперь разрешение Promise гарантированно будет асинхронным, поэтому даже если вы решите его синхронно, как в вашем случае, обратные вызовы .then
будут вызываться только после 1 тика. Теперь первый из них будет регистрироваться после одного тика, второй также разрешится после одного тика, затем разрешится цепочка Promise, которая будет ждать другого тика до завершения третьего.
Таким образом, «обещание2» будет зарегистрировано после одного тика, а «конец async1» - после двух тиков.
Тем не менее, вы не должны полагаться на порядок выполнения обещаний.