Привет, Тимур, очень уважаю тебя как эксперта в JS. У меня к тебе нетривиальные задачки. Был на собеседовании Node.js разработчика на 120к, и не смог ответить на 3 из 4 вопросов. Код первого вопроса: const arr = [5, 12, 16, 23] console.log(arr[4]) //Вывод 20 console.log(arr[Variable]) //Вывод 20 Надо добавить что-то после arr (менять массив нельзя), чтобы консоль логи отрабатывали корректно и выводили 20 при таком обращении к массиву. Variable в коде не определяется. Второй вопрос такой: Мы посылаем 1000 долгих запросов на сервер, 500 из них ещё не вернули ответ. И мы переодически убиваем процесс Node.js через kill(9). Нужно, чтобы эти 500 незавершенных запросов отправили на клиент ошибку status: 400. Я предложил использовать gateway сервис и через него перенаправлять запрос к процессу, либо попробовать через nginx(или подобную технологию) отдавать статус код. Такой вариант собеседующему сильно не понравился. Найти какой-либо ответ на это я найти не смог. Может ты или кто другой подскажет, какой ответ от меня ожидали?
*Часть с индексом arr[4] имеет два решения:* 1) Proxy. (Комментарием выше есть пример) 2) Использование прототипов: Reflect.setPrototypeOf(arr, {4: 20}); arr[4]; // 20 *Часть с Variable имеет два решения:* 1) через Proxy 2) поскольку в условии задачи не определен "use strict" то мы можем использовать with для изменения контекста, подставив вместо оригинального - обьект с проперти Variable. Если к этому добавить решения для Arr[4] то будет это выглядеть вот так Reflect.setPrototypeOf(arr, {4: 20}); with ({Variable:4}) { arr[Variable] } *Задание с kill* Это задание странно пахнет по следующим причинам: kill -9 это сигнал который само приложение к которому применяется этот сигнал, перехватить его не может. Потому, либо ожидают решение на основе какого-то фееричного костыля, либо задача специально сделана так, чтобы соискатель ответил - при отправке 9 сигнала или SIGKILL в POSIX системах, процесс не может отследить этот сигнал, а значит задача общего решения не имеет.
Контракт, это то, интерфейс в виде тайпинга или спецификации, например jsdoc или .d.ts + поведение, т.е. это не только имена и типы, но и то, что невозможно описать типами, т.е. асинхронный аспект или последовательность вызовов или изменений. Пример: Promise, shared arrays, fetch. У меня есть отдельная лекция ua-cam.com/video/K5_kSUvbGEQ/v-deo.html
Воркеры не являются частью исполняемой программы JS, поэтому нет никакой смеси с многопоточностью. Это однопоточное приложение со своей спецификой отложенного исполнения кода, который мы по привычке называем асинхронным. Тут даже нет классической схемы асинхронного запуска кода, только вызов WebAPI и эмуляция через колбеки. Я прошел собеседование, учитель?
Вы про воркеры в тред-пуле или воркер-треды? Какие признаки бы можно было предъявить, чтобы они были частью исполняемой js-прогоаммы? Кстати очень неточный термин, исполняемая js-программа, что это?
Сам вопросы написал, сам на них ответил)). А чё так можно* Ты же понимаешь что они сейчас начнут дёргать эти вопросы на собесы, без всякой валидации твоих ответов?
Тимур, смотрю с огромным удовольствием уже лет 5. Спасибо большое! Заразительные знания
Привет, Тимур, очень уважаю тебя как эксперта в JS. У меня к тебе нетривиальные задачки. Был на собеседовании Node.js разработчика на 120к, и не смог ответить на 3 из 4 вопросов.
Код первого вопроса:
const arr = [5, 12, 16, 23]
console.log(arr[4]) //Вывод 20
console.log(arr[Variable]) //Вывод 20
Надо добавить что-то после arr (менять массив нельзя), чтобы консоль логи отрабатывали корректно и выводили 20 при таком обращении к массиву. Variable в коде не определяется.
Второй вопрос такой:
Мы посылаем 1000 долгих запросов на сервер, 500 из них ещё не вернули ответ. И мы переодически убиваем процесс Node.js через kill(9). Нужно, чтобы эти 500 незавершенных запросов отправили на клиент ошибку status: 400. Я предложил использовать gateway сервис и через него перенаправлять запрос к процессу, либо попробовать через nginx(или подобную технологию) отдавать статус код. Такой вариант собеседующему сильно не понравился.
Найти какой-либо ответ на это я найти не смог. Может ты или кто другой подскажет, какой ответ от меня ожидали?
const arr = [5, 12, 16, 23];
// Создаем прокси для массива
const handler = {
get: function(target, prop) {
if (prop == 4 || prop == 'Variable') {
return 20;
}
return target[prop];
}
};
const proxyArr = new Proxy(arr, handler);
console.log(proxyArr[4]); // Вывод: 20
console.log(proxyArr['Variable']); // Вывод: 20
*Часть с индексом arr[4] имеет два решения:*
1) Proxy. (Комментарием выше есть пример)
2) Использование прототипов:
Reflect.setPrototypeOf(arr, {4: 20});
arr[4]; // 20
*Часть с Variable имеет два решения:*
1) через Proxy
2) поскольку в условии задачи не определен "use strict" то мы можем использовать with для изменения контекста, подставив вместо оригинального - обьект с проперти Variable. Если к этому добавить решения для Arr[4] то будет это выглядеть вот так
Reflect.setPrototypeOf(arr, {4: 20});
with ({Variable:4}) {
arr[Variable]
}
*Задание с kill*
Это задание странно пахнет по следующим причинам:
kill -9 это сигнал который само приложение к которому применяется этот сигнал, перехватить его не может.
Потому, либо ожидают решение на основе какого-то фееричного костыля, либо задача специально сделана так, чтобы соискатель ответил - при отправке 9 сигнала или SIGKILL в POSIX системах, процесс не может отследить этот сигнал, а значит задача общего решения не имеет.
спасибо❤
А где посмотреть первые 50? ((
Под видео ссылка
@@antergonza6476 а разбор на курсе мы делали на той неделе
что вы обозначаете "контрактом"?
Контракт, это то, интерфейс в виде тайпинга или спецификации, например jsdoc или .d.ts + поведение, т.е. это не только имена и типы, но и то, что невозможно описать типами, т.е. асинхронный аспект или последовательность вызовов или изменений. Пример: Promise, shared arrays, fetch. У меня есть отдельная лекция ua-cam.com/video/K5_kSUvbGEQ/v-deo.html
Воркеры не являются частью исполняемой программы JS, поэтому нет никакой смеси с многопоточностью. Это однопоточное приложение со своей спецификой отложенного исполнения кода, который мы по привычке называем асинхронным. Тут даже нет классической схемы асинхронного запуска кода, только вызов WebAPI и эмуляция через колбеки.
Я прошел собеседование, учитель?
Вы про воркеры в тред-пуле или воркер-треды? Какие признаки бы можно было предъявить, чтобы они были частью исполняемой js-прогоаммы? Кстати очень неточный термин, исполняемая js-программа, что это?
Следуя Вашей логике, Go тоже однопоточный.
JavaScrip в названии ... Опечатка или великий заложенный смысл?
Поправил, спасибо
Сам вопросы написал, сам на них ответил)). А чё так можно* Ты же понимаешь что они сейчас начнут дёргать эти вопросы на собесы, без всякой валидации твоих ответов?