Чтобы ответить на ваш первый вопрос, это довольно просто:
У вас есть 2 объекта обещания, когда вы дойдете до тех строк, которые вы упомянули: одна удерживается переменной promise
, а другая - p1
переменная. Когда вы связываете catch
непосредственно с promise
, это не относится к обещанию, которое возвращается из цепочки then
- которая хранится в p1
- поэтому вы получаете unhandled promise rejection error
на обещание, которое возвращается из предложения then
.
Но, когда вы связываете его с p1
, который уже связан с promise
, тогда предложение catch
охватывает их обоих так,здесь нет ошибок.
Разница, в сущности, заключается в том, что строка // 1 может отлавливать отклонения / ошибки как из исходного обещания, так и из обещания .then
, но строка // 2 захватывает только отклонения от исходного обещания, оставляя отклоненияиз .then
необработано.
О 2-м вопросе Извините, но слишком высокий уровень для меня, и я не хочу давать неполный / неточный ответ.