Покажите мне ваши промисы
Вчера один опытный инженер показывал цепочку промисов:
// promise.then(onFulfilled: Function[, onRejected: Function]);
Promise.resolve("")
.then(a, b)
.then(c, d)
.then(e, f);
И спрашивал что будет, если a
падает (то бишь бросает):
Promise.resolve("")
.then(_ => { throw new Error("A") }, b)
.then(c, d)
.then(e, f);
У нас тут в джаваскрипте такие дела что, если исключение произошло в обработчике onFulfilled
, то оно проглатывается, и в рантайме ничего не падает. Это просто надо знать.
И спросил что будет дальше. А я и растерялся, потому что в промисах не алё и сам не понимаю как так вышло. Вроде и много раз видел, и пользовался даже, но сказал, что нормальная цепочка должена иметь .catch
в хвосте, куда и должны прилетать все исключения.
Promise.resolve("")
.then(_ => {throw new Error("💩")}, b)
.then(c, d)
.then(e, f)
.catch(val => {/* Error 💩 */});
Но обработка ошибки в одном месте — это недостаточно сложно, нет простора для ошибки, и откровенно скучно. Оказалось, что на самом деле ошибка придет в d
. Если пытаться продолжить эксперимент и бросить ошибку в d
то сюрприза не выйдет — упадет в рантайме.
Ну ладно, добавим в копилку еще один js wtf
, где исключение это то же самое, что и rejected promise
, но дальше то что? Ну я и говорю, что всё. Дальше некуда, навыполнялись. А промис взял и начал выполнять e
, принимая значение из d
. Еще раз, выполнять e
. После d
. Мы вызвали onFulfilled
с результатом из onRejected
. Что? Зачем?
Надо тебе в потоке данные модифицировать, ну возьми ты стрим. Надо в цепочке что-то посчитать — так есть же Either. Не надо жонглировать факелами, стоя на бритве.
Википедия и школа
В 2001 в интернете появилась Википедия, а в 2006 интернет вместе с Википедией появились у меня дома. Я застал времена, когда русский раздел рос прямо на глазах, ни одному факту нельзя было доверять (но я все равно доверял) и в статьях про рэперов можно было узнать что он лох или чмо.
В 2008 я уже готовился к экзамену по матанализу используя Википедию вместо конспекта (не сдал, конечно, но это другая история), а сегодня я привык по нескольку часов читать полные статьи с кучей перекрестных ссылок и источников.
Так вот, недавно на глаза мне попался белорусский учебник истории для восьмого класса:
И я сразу вспомнил почему пририсовывать усы мореплавателям было всегда интереснее, чем читать этот самый учебник. Не, ну вы только представьте если бы редактирование всех школьных материалов отдали на откуп сообществу:
Христофор Колумб — самый знамениый и великий мореплаватель. Выходец из итальянского города Генуя, он находился на службе у испанских королей. Колумб считал, что Земля круглая (это, конечно же спекуляция, потому что это было известно широкому кругу людей, но не было проверено на практике). Поэтому надеялся добраться до Индии и Китая, плывя в западном направлении. Его экспедицию поддерживала и финансировала королева Испании Изабелла Кастильская.
И ты такой сидишь, ходишь по ссылкам, гугл-карту 15-го века двигаешь.
Такой учебник я бы читал.