Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Во-первых, не понятно что делать если [...] выбросят несколько ошибокНу тут, очевидно, два варианта. Либо ловить первую, либо собирать их в массив. Promise.all работает по первой стратегии: если один из входов фейлит, то фейлит и их композиция с этой ошибкой. Тут плюс в том, что не нужно дожидаться ответов от всех входов, можно продолжать после первого фейла. И с другой стороны, попробуйте придумать ситуацию, когда нам действительно нужно получить весь массив ошибок? Как правило, нам достаточно того, что ошибка совершилась, и нужно переходить к её обработке. А что там с остальным, так разберёмся, когда этот блок перестанет выдавать ошибку.
А если мы уже ушли далеко вниз а в каком-нибудь parEach выше по таймеру выскочила ошибка?Я, наверно, не до конца понимаю идею этой библиотеки. Как мы можем «уйти вниз», если ещё не получены все результаты? Документация грит:
parEach waits for all actions to call this() before moving along to the next action in the chain.Если она ждёт ответа ото всех входов, то она дождётся и любой ошибки.
Поэтому, я решил, что в каждом YAFF должна быть только одна конструкция для обработки ошибок и она должна быть в конце.Так нельзя, это всё равно что предлагать в синхронном программировании сделать один блок try-catch на всю программу и обязать программистов размещать catch в main. Многоуровневые catch просто необходимы. Например, у нас есть асинхронная либа, которая кормит нас такими потоками (flow). У неё есть внутренние ошибки, например, вызванные отсутствием файлов. Но на выходе, она преобразует невнятные внутренние ошибки в понятные ошибки из своего API. Или ещё пример: либа скармливает нам типизированные ошибки, мы хотим отлавливать их по-отдельности, на разных уровнях. Для всего этого нужны многоуровневые catch.
мы программируем только оптимистичный случай когда все работает как надоДа, понял стратегию. Это достаточно просто и наглядно, и ещё я думаю более производительно в реализации.
this.Seq([1,2,3,4,5,6,7])
.parEach(function (num) {
if (num % 2 == 0)
return setTimeout(function () {this('ha-ha!')}.bind(this), 100)
this(null, num);
})
.catch(function () {
log('orig catch:', arguments);
})
.seq(function () {
log('regual seq', arguments);
this();
})
.catch(function () {
log('should not be called', arguments)
});
orig catch: { '0': 'ha-ha!', '1': 1 }
regual seq { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5, '5': 6, '6': 7 }
orig catch: { '0': 'ha-ha!', '1': 3 }
regual seq {}
orig catch: { '0': 'ha-ha!', '1': 5 }
regual seq {}
node-seq на новый лад (опять про асинхронность)