Comments 34
setTimeout(function() {
feedback.send()
})
нарушение неписаных правил иногда приводит к победе
Во-первых, проблемы с манкипатчингом и изменением встроенных объектов описаны давно и хорошо. Что, уже никто не помнит Prototype.js?
Во-вторых, о победе пока речи нет, команда здорово всех отпугнула, ломая API на стадии RC, релиз вышел только что и пока непонятно, взлетит или нет.
Про Angular 2 говорить еще рано. В свое время с товарищем очень скептически отнеслись к Реакту. А он полетел, причем довольно высоко.
По моим оценкам, Angular 2 получился удобным и гибким. Частые изменения тоже объяснимы. В остальном время покажет.
Дайджест-цикл изначально был провальным решением. И, главное, зачем было городить этот огород? Просто чтобы не писать model.set('key', value)
? Так приходилось писать $timeout(() => this.key = value)
, вместо явного вызова грязный хак. Так что хорошо, что избавились, конечно.
Частые изменение объяснимы, конечно, но народ, который пытался вскочить на этот поезд, был недоволен
Еще раз: я не против изменений. Просто это создало некоторое негативное впечатление в сообществе.
Удивительный аргумент про длинные стектрейсы.
Во-первых, в длинном стектрейсе помимо важной информации содержится еще куча упоминаний самого zone.js. Не уверен что ковырять этот стек вызовов будет легче чем найти место подписки в чистом коде без зон.
Во-вторых, exception в зоне проглатывается. А это плохо, потому что ломает стандартое поведение бразуера. (Например, аналитика ошибок без дополнительных костылей собираться не будет) Да еще и неудобно для разработчика потому что флаг "pause on uncaught exceptions" в бразузере перестает работать
И это усложняет работу, потому что приходится дополнительно ловить кучу уже пойманных исколючений чтобы найти среди них свое.
Да и в целом удивительно.
Команда React борется за то, чтобы исключения в пользовательском коде не терялись во внутренностях фреймворка, чтобы инструменты отладки в браузерах работали как надо.
А в команде Angular и сопутствующих технологий пишут бразузер внутри браузера, с которым нужно научиться правильно работать, да еще и специальные иструменты для разработки использовать.
А зачем мне управлять этим процессом, если меня устраивает стандартное браузерное поведение?
Стектрейсы на сервер отправлять я и без зон могу, вот посмотреть бы на пример того, что могут только они.
Проблема в вашем примере в том, что если выбрасывать ошибку наружу, то браузер остановится где-то в зоне, где она бросает ошибку наружу, а не на оригинальном месте, как ожидалось
Проблема в том, что браузер останавливается где-то внутри кода zone.js, а не вашем. Пользы от этого немного, ведь причины остановки не понять.
Как я воспроизвожу баг пользователя:
Открываю отладчик, ставлю флаг, чтобы останавливался на всех непойманных исключениях. Затем проделываю какие-то действия. Если случилось исключение, браузер останавливается на этой строке, сразу в контексте, со всеми переменными из замыкания. Можно смотреть значения и разбираться, что здесь не так.
До этого у меня был опыт работы с Angular 1, где все исключения проглатыавались как и в zone. Там приходилось долго копать до настоящего места с ошибкой, и меня это всегда расстраивало.
В общем, мой пойнт в том, что проглатывать исключения — это плохо. Плюсов, кроме абстрактного "зато все гибко", вы так и не привели, а неудобства налицо.
А у вашего callback
даже метода call
нету. Но почему-то это недостатком не считается...
У вас производительность убивается объектом arguments. Если старые браузеры не важны, можно сделать так:
function callCallback(callback, ...args) {
return callback.fn.apply(callback.context, args);
}
Но, вообще говоря, невозможность замены контекста обычно рассматривается как достоинство, а не недостаток. Так что bind
прекрасно решает большинство задач.
var feedback = new function(){
var self = this;
this.message = 'Привет!';
this.send = function () {
alert(self.message);
}
};
Получается конечно не так компактно, но, имхо, лучше, чем использовать специальный объект для трекинга контекста…
И конкретно в этом примере, раз уж объект через объявлен через var, то можно еще и так:
var feedback = {
message: 'Привет!',
send: function () {
alert(feedback.message)
}
}
Zone.js или как Dart спас Angular