До бамбу мы пробовали TeamCity, если сравнивать с бамбу – последний выигрывает в удобстве использования.
Про велосипед – нам требуется серьезная аналитика для наших клиентсайд приложений. GA не подходит по некоторым причинам (как минимум – среда выполнения кода не позволяет подключать ga.js). Штуки вроде statsD/graphite (на первый взгляд, по крайней мере) подходят для анализа простых количественных метрик, но не дают возможности удобно работать с различными срезами/измерениями/фильтрами/аггрегациями. Тут бы подошел OLAP, но его одного тоже недостаточно, нужен комплексный подход, а времени как всегда не хватает) Так что пока мы перебиваемся собственным решением на python/mongo/aggregation framework, и думаем как сделать систему, которая будет удовлетворять наши потребности на 100%.
Очень похоже на то, как у нас все устроено. Отличается несколько моментов:
* Мы не собираем пакеты (а, возможно, надо бы, подумаем)
* Мы используем hgflow (кстати, советую присмотрется, в вашем случае — к gitflow)
* В качестве CI используем Bamboo — проект тоже от Atlassian, поэтому прекрасно интегрируется с Jira и остальными
* Статистика у нас — свой велосипед
Буквально неделю назад прикрутили у себя валидацию данных, приходящих с клиентских приложений на сервер, с помощью JSON-schema. Сделали логирование ошибок в данных в сентри, оказалось более 10 ошибок в несложном объекте. Короче, крайне рекомендую.
Нет, на самом деле в JS есть простые типы. Число 5 — это простой тип, а вот new Number(5) — это объект класса Number. Поэтому они и не равны при строгом сравнении.
В примере из топика я наоборот нигде не вижу прямых вызовов runNext в теле функции.
Про костыль в принципе согласен, но случай, когда требуется делать столько вложенных вызовов, что можно переполнить стэк — это как минимум хороший повод задуматься над архитектурой.
То что таймер может «влезть» и нарушить последовательность — то же самое.
Во-первых, не всегда, а только если колбэк вызывается из функции явно (в конце функции, например). А такая ситуация не требует вложенных колбеков в принципе, можно просто вернуть результат в вышестоящую функцию и продолжить выполнение там. В других же случаях, когда используется XHR, или асинхронное чтение из файла, или еще что-то подобное — вызов приходит из среды исполнения.
Во-вторых, как уже заметили ниже, setTimeout с минимальной задержкой спасет стэк от переполнения.
Про велосипед – нам требуется серьезная аналитика для наших клиентсайд приложений. GA не подходит по некоторым причинам (как минимум – среда выполнения кода не позволяет подключать ga.js). Штуки вроде statsD/graphite (на первый взгляд, по крайней мере) подходят для анализа простых количественных метрик, но не дают возможности удобно работать с различными срезами/измерениями/фильтрами/аггрегациями. Тут бы подошел OLAP, но его одного тоже недостаточно, нужен комплексный подход, а времени как всегда не хватает) Так что пока мы перебиваемся собственным решением на python/mongo/aggregation framework, и думаем как сделать систему, которая будет удовлетворять наши потребности на 100%.
* Мы не собираем пакеты (а, возможно, надо бы, подумаем)
* Мы используем hgflow (кстати, советую присмотрется, в вашем случае — к gitflow)
* В качестве CI используем Bamboo — проект тоже от Atlassian, поэтому прекрасно интегрируется с Jira и остальными
* Статистика у нас — свой велосипед
Хватит из JS делать C++! Остановитесь!
Нет, на самом деле в JS есть простые типы. Число 5 — это простой тип, а вот new Number(5) — это объект класса Number. Поэтому они и не равны при строгом сравнении.
Про костыль в принципе согласен, но случай, когда требуется делать столько вложенных вызовов, что можно переполнить стэк — это как минимум хороший повод задуматься над архитектурой.
То что таймер может «влезть» и нарушить последовательность — то же самое.
В JQuery еще есть хорошая реализация паттерна Deferred.
Во-вторых, как уже заметили ниже, setTimeout с минимальной задержкой спасет стэк от переполнения.