я имел ввиду, что await getPromise() способен асинхронно вернуть промис.
То, что с точки зрения архитектуры они все построены поверх промисов — я знаю.
Lazy-load штука хорошая. Но я бы вам рекомендовал посмотреть на асинхронные задачи, все-таки в самой ноде обычно проводится на порядок меньше времени, чем в libuv.
К тому же клиент обычно не сразу инициализируется, а времени на загрузку тратится совсем немного.
У меня сейчас примерно так работает одна система, которая весьма бодро аггрегирует данные из соцсетей.
//noinspection JSUnresolvedVariable
var remaining_thread_count = Number(process.env.THREAD_COUNT) || 150;
export async function init() {
...миграции БД...
while (remaining_thread_count--)
/*important! not an async call, that's an fibering*/
start_thread();
}
async function start_thread() {
await (await getNextTask());
start_thread();
}
Да, кстати. Для журналирования в ноде настоятельно рекомендуется joylent логгер bunyan — он как раз по умолчанию пишет прямо JSON-ом в stdout, который уже как раз можно пайпить куда надо.
Про одноразовость (disposability) — тут немножко более интересный момент, который в оригинальной статье не очень хорошо объяснен, и может быть не понятен не очень продвинутым разработчикам.
Перевод не очень точен, более верно — «утилизируемость», как есть, это гораздо более точно дает понимание происходящего: процесс действительно может быть перезапущен в любой момент времени и при этом не потеряет никаких данных. В это вкладываются два понятия: атомарность операций (процесс не умирает до завершения или отката операции) и отсутствие состояния — все хранится в БД или очереди сообщений, а процессы просто разворачиваются на имеющихся данных и работают в них. Это все делает приложение практически непотопляемым — максимум полежит немножко и дальше пойдет.
Два долбанутых юзкейса в копилку:
-Тинькофф-банк. Возможность звонка через интернет прямо из мобильного банка. Не, я не спорю — молодцы, это круто. Но какого хрена каждый раз, когда я звоню, у них ничего не высвечивается обо мне? Ладно, с мобильного телефона не опознают (хотя могли бы привязанный номер выцеплять). Но по интернету-то можно было бы данные вытаскивать.
Олег Тиньков распевается соловьем про конверсию и оптимизации, но это вот действительно вызывает дискомфорт — стоишь в очереди в другой стране и на своем непонятном для них языке вынужден звонить, тратить минут 10 бедной девочки чтобы разблокировать карту.
-Идиотские поля ввода имени и фамилии с банковской карты. Я раньше пользовался связной-банком, у которого так и написано — SVYAZNOYBANK.RU. И вот каждая вторая форма считала делом чести проверить, нет ли ничего в поле ввода кроме букв и пробела. А каждая третья требовала обязательный пробел.
Если бы эмпирически не подобрал на второй месяц, что на имя владельца карты в таких случаях всем плевать и писал наобум — то я просто не мог бы заплатить никак.
надо бы уточнить опрос, кстати. Pentile иногда делает глазам больно даже в fullHD, при этом обычная матрица проблем не дает даже в 720р.
А вообще я давным-давно сформулировал для себя идеальный юзкейс (который, к сожалению, почти что хрен воплотишь в жизнь).
Телефон — звонки, плеер, фотоаппарат, какая-то информация в сети, редко — книги, игры. Соответственно — 3.5'' — 5'' экран 720p, более-менее большая батарея, хорошая оптика, достаточно памяти либо поддержка microSD (предпочтительно). Таскается всегда, что очевидно. Решением оказался Xperia z1 compact. К сожалению, оказался относительно глючным и ни разу не водонепроницаемым — после «окунания» умер 3.5 джек. К чести телефона — работает полтора-два дня, отлично снимает фото-видео и радует быстродействием. Но минусы есть тоже, конечно.
Планшет — место для запасной сим-карты (если еду в другую страну — хотел бы смски из банка получать и все такое), развлекательный контент, полноценные игрушки, нормальная работа с почтой, по необходимости и полноценная работа с легковесной внешней клавиатурой. В общем вспомогательные функции и поразвлекаться. Используется в основном долгих дорогах и дома. Требования — хотя бы fullHD, поддержка карт памяти (смотреть контент с других устройств) и сим-кард (очень желательно LTE), максимальная диагональ экрана, и, внимание, очень важный момент — ширина в 125-135мм. 140-150мм — это ширина внутреннего кармана любой куртки, соответственно, такой размер позволяет брать планшет с собой в куртке, а не в сумке или руках. До сих пор не понимаю, почему до производителей эта идея никак не дойдет: есть dell venue 8 7000 (собственно, жду версию с LTE), который с диагональю в 8.4 дюйма и шириной в 130мм, полтора дюйма большой разницы не делают, но очень сильно упрощают возможность брать планшет с собой куда угодно.
Вот тут — не спорю. Но они служат больше для того, чтобы обозначать группы изменений как смену целостного состояния — мы все знаем, что по-хорошему каждый коммит должен работать, и при «археологических раскопках» важно понимать, что те или иные группы изменений были связаны.
Для железа — да, возможно, что-то делается просто потому что это эффективнее всего.
С программированием все куда интереснее. Если ваш код при прочтении вызывает вопросы — это либо плохой код, либо грязные хаки (то есть борьба с плохим кодом другого программиста / железом). Первое надо исправлять, второе — документировать.
Если программист начинает делать журнал записей, чтобы не забыть, почему он делает то или иное (не документацию к внешним интерфейсам, а именно журнал того, как он делает) — он делает что-то не так.
Вот вам дзен питона про это:
Явное лучше, чем неявное.
Простое лучше, чем сложное.
…
Должен существовать один — и, желательно, только один — очевидный способ сделать это.
…
Если реализацию сложно объяснить — идея плоха.
Если реализацию легко объяснить — идея, возможно, хороша.
То, что с точки зрения архитектуры они все построены поверх промисов — я знаю.
async-функции МОГУТ возвращать промисы как результат работы.
К тому же клиент обычно не сразу инициализируется, а времени на загрузку тратится совсем немного.
У меня сейчас примерно так работает одна система, которая весьма бодро аггрегирует данные из соцсетей.
Не надо :( У меня вчера квадракоптер улетел в 10-метровое дерево и застрял. Если бы он еще и с телефоном улетел — это было бы совсем обидно.
Про одноразовость (disposability) — тут немножко более интересный момент, который в оригинальной статье не очень хорошо объяснен, и может быть не понятен не очень продвинутым разработчикам.
Перевод не очень точен, более верно — «утилизируемость», как есть, это гораздо более точно дает понимание происходящего: процесс действительно может быть перезапущен в любой момент времени и при этом не потеряет никаких данных. В это вкладываются два понятия: атомарность операций (процесс не умирает до завершения или отката операции) и отсутствие состояния — все хранится в БД или очереди сообщений, а процессы просто разворачиваются на имеющихся данных и работают в них. Это все делает приложение практически непотопляемым — максимум полежит немножко и дальше пойдет.
Сам хотел перевести не так давно, опередили!
-Тинькофф-банк. Возможность звонка через интернет прямо из мобильного банка. Не, я не спорю — молодцы, это круто. Но какого хрена каждый раз, когда я звоню, у них ничего не высвечивается обо мне? Ладно, с мобильного телефона не опознают (хотя могли бы привязанный номер выцеплять). Но по интернету-то можно было бы данные вытаскивать.
Олег Тиньков распевается соловьем про конверсию и оптимизации, но это вот действительно вызывает дискомфорт — стоишь в очереди в другой стране и на своем непонятном для них языке вынужден звонить, тратить минут 10 бедной девочки чтобы разблокировать карту.
-Идиотские поля ввода имени и фамилии с банковской карты. Я раньше пользовался связной-банком, у которого так и написано — SVYAZNOYBANK.RU. И вот каждая вторая форма считала делом чести проверить, нет ли ничего в поле ввода кроме букв и пробела. А каждая третья требовала обязательный пробел.
Если бы эмпирически не подобрал на второй месяц, что на имя владельца карты в таких случаях всем плевать и писал наобум — то я просто не мог бы заплатить никак.
надо бы уточнить опрос, кстати. Pentile иногда делает глазам больно даже в fullHD, при этом обычная матрица проблем не дает даже в 720р.
А вообще я давным-давно сформулировал для себя идеальный юзкейс (который, к сожалению, почти что хрен воплотишь в жизнь).
Телефон — звонки, плеер, фотоаппарат, какая-то информация в сети, редко — книги, игры. Соответственно — 3.5'' — 5'' экран 720p, более-менее большая батарея, хорошая оптика, достаточно памяти либо поддержка microSD (предпочтительно). Таскается всегда, что очевидно. Решением оказался Xperia z1 compact. К сожалению, оказался относительно глючным и ни разу не водонепроницаемым — после «окунания» умер 3.5 джек. К чести телефона — работает полтора-два дня, отлично снимает фото-видео и радует быстродействием. Но минусы есть тоже, конечно.
Планшет — место для запасной сим-карты (если еду в другую страну — хотел бы смски из банка получать и все такое), развлекательный контент, полноценные игрушки, нормальная работа с почтой, по необходимости и полноценная работа с легковесной внешней клавиатурой. В общем вспомогательные функции и поразвлекаться. Используется в основном долгих дорогах и дома. Требования — хотя бы fullHD, поддержка карт памяти (смотреть контент с других устройств) и сим-кард (очень желательно LTE), максимальная диагональ экрана, и, внимание, очень важный момент — ширина в 125-135мм. 140-150мм — это ширина внутреннего кармана любой куртки, соответственно, такой размер позволяет брать планшет с собой в куртке, а не в сумке или руках. До сих пор не понимаю, почему до производителей эта идея никак не дойдет: есть dell venue 8 7000 (собственно, жду версию с LTE), который с диагональю в 8.4 дюйма и шириной в 130мм, полтора дюйма большой разницы не делают, но очень сильно упрощают возможность брать планшет с собой куда угодно.
В общем как-то раз одни извращенцы скомпилировали хромиум в asm.js и смогли его запустить в firefox.
С программированием все куда интереснее. Если ваш код при прочтении вызывает вопросы — это либо плохой код, либо грязные хаки (то есть борьба с плохим кодом другого программиста / железом). Первое надо исправлять, второе — документировать.
Если программист начинает делать журнал записей, чтобы не забыть, почему он делает то или иное (не документацию к внешним интерфейсам, а именно журнал того, как он делает) — он делает что-то не так.
Вот вам дзен питона про это:
github.com/Flipboard/react-canvas
А, вот, с сайта.
JavaScript implementation used for benchmarking is V8