1. Сколько catch реально нужно в цепочке Promise
Технически достаточно одного
catch в конце цепочки. Он перехватит любую ошибку, возникшую выше. Дополнительные catch нужны только тогда, когда ошибку нужно обработать локально и продолжить выполнение цепочки. Лишние catch без необходимости усложняют код и ухудшают читаемость.2. Можно ли выбросить ошибку внутри then и как она будет обработана
Да, внутри
then можно выбросить ошибку с помощью throw. Такая ошибка автоматически превращает Promise в rejected. Она будет поймана ближайшим catch ниже по цепочке. По сути, throw внутри then эквивалентен return Promise.reject(error).3. Почему при использовании let в цикле значения разные
let в цикле создает новую переменную на каждую итерацию. Поэтому каждое замыкание “запоминает” свое значение. В отличие от var, где используется одна общая переменная на весь цикл, let предотвращает типичную ошибку с одинаковыми значениями. Это поведение заложено в спецификацию языка.4. Что будет возвращать функция-счётчик при использовании замыкания
Функция-счётчик будет возвращать увеличивающееся значение при каждом вызове. Это возможно потому, что внутренняя функция сохраняет доступ к переменной из внешней функции. Такая переменная не уничтожается после выполнения, а продолжает жить в замыкании. Каждый вызов использует одно и то же сохраненное состояние.
5. В каком порядке выполняются then, catch и finally у Promise
then вызывается при успешном выполнении Promise, catch — при ошибке, а finally — всегда, независимо от результата. finally выполняется после then или catch, но не меняет значение, если сам не выбрасывает ошибку. Все эти колбэки выполняются как микротаски. Порядок строго следует цепочке.#promise #catch #error #throw #let #block #closure #lexical #then