Во-первых, бессмысленно пытаться понять возможную проблему заказа между двумя совершенно независимыми цепочками обещаний.При программировании вы должны рассматривать их порядок как неопределенный (и фактически, как только у вас есть реальные асинхронные операции внутри цепочек обещаний, которые обычно содержались бы в любых реальных реализациях цепочки обещаний, порядок станет неопределенным).Если порядок важен для вас между двумя цепочками, вам нужно добавить определенный код для координации действий двух независимых цепочек обещаний.
Итак, наблюдаемый порядок в вашем фрагменте таков:
error1
error2
continue1
continue3
Поскольку у вас нет никаких асинхронных операций ни в одном из ваших обработчиков .then()
или .catch()
, он просто будет переключаться между двумя цепочками обещаний (что, по-видимому, и происходит при запуске вашего сниппета).Вот как он будет в основном выполняться:
- Первый
Promise.resolve()
выполняется, что добавляет в очередь событий событие для запуска его обработчиков .then()
. - Второй
Promise.resolve()
выполняет, что добавляетв очередь событий - событие для запуска его обработчиков .then()
. - Ваша последовательность JS выполнена, поэтому управление возвращается в очередь событий.Вызывается первый обработчик
.then()
, который затем вставляет другое событие в очередь событий для запуска обработчика .catch()
и возвращает управление обратно в цикл событий. - Второй обработчик
.then()
находится вверху событияочередь и запускается - И так далее ...
Имейте в виду, что согласно спецификации обещания каждый последующий обработчик .then()
или .catch()
должен выполняться асинхронно (включенследующий поворот очереди событий).Цепочка обещаний не выполняется так быстро, как может одним махом.Он выполняет следующий шаг, помещает этот шаг в очередь, а затем возвращает управление в цикл обработки событий, который выталкивает следующее событие из очереди.Это заставит вращаться управление между различными цепочками обещаний, которые не ожидают завершения чего-либо еще.
Но, повторяю, вам не следует зависеть от этого уровня порядка выполнения и, в более сложных реальных условиях.В случае с другими асинхронными операциями вы не можете попытаться предсказать порядок.Следует предположить, что эти две отдельные цепочки обещаний выполняются в неопределенном порядке за пределами синхронной части (каждая Promise.resolve()
).И затем, если какой-либо конкретный порядок имеет значение для вашего кода, вы должны добавить код, чтобы фактически синхронизировать и контролировать порядок выполнения, используя Promise.all()
или связывая цепочки вместе в одну разветвленную цепочку или одну цепочку последовательностей или что-то подобное в зависимости от потребностейкод.