• Ajax внутри функции, как вернуть результат запроса?

    @Faliah
    Один из вариантов - использовать deferred, который есть из коробки:
    function getEndpoint(method, url) {
      var apiBaseUrl = 'http://server.ser/mobile_app/'
      
      return function(data) {	
        
        return $.ajax({
          url: apiBaseUrl + url,
          type: method,
          dataType: 'json',
          data: data
        })
      }
    }
    
    var tryLogin = getEndpoint('POST', '/post');
    
    tryLogin({ user: 'Foo', pass: 'bar' })
      .done(function(data) { 
        if (typeof data.success != 'undefined' && data.success == 'ok') {
          console.log('try login true');    
        }
      })
      .fail(function(jqXHR, textStatus, errorThrown) {
        console.log('Ошибка: ' + textStatus + ' | ' + errorThrown);
      });
    Ответ написан
    Комментировать
  • Что делает этот участок кода?

    @Faliah
    Создает переменную c, значением которой, устанавливает анонимную функцию. Анонимная функция ожидает в качестве аргумента объект и возвращает так же объект. В случае, если в объекте, переданном в качестве аргумента, есть свойство a, которое, в свою очередь так же является объектом, и имеет свойство b, функция c вернет объект с одним свойством b и значением, скопированным из одноименного свойства объекта a.
    // c :: Object -> Object
    
    console.log( c({ a: { b: 'foo' } }) ) // -> Object {b: "foo"}


    В любых других случаях вернется объект
    { b: undefined }
    Ответ написан
    Комментировать
  • Почему без return function код не работает?

    @Faliah
    В данном случае вы получаете своего рода фабрику счётчиков. При каждом вызове makeCounter() возвращается ссылка на объект фунции, а не на её результат. Так же в данном примере используется замыкание, которое дает возвращаемой функции возможность обращаться к переменной currentCount, которая нахоится в родительской области видимости.
    function makeCounter() {
    
      var currentCount = 1;
    
      return function() {
        return currentCount++;
      };
    }
    
    var counter = makeCounter();
    var counter1 = makeCounter();
    
    console.log(counter()); //1
    console.log(counter()); //2
    // счётчики работают независимо друг от друга
    console.log(counter1()) //1


    Этот пример, конечно больше синтетический, зато охватывает несколько чрезвычайно важных концепций в JS, а именно: замыкания, области видимости, first-class function. First-class function, в свою очередь, означает ряд принципов, которым следуют абсолютно все функции, создаваемые в JS:
    • Каждая функция является объектом или экзмепляром объектоного типа (instance of Object type)
    • У функции могут быть свойства. К примеру запись makeCounter.foo = "bar", абсолютно валидна. Подобный подход используется для создания статических свойств функции
    • Ссылку на объект функции можно сохранить в переменной, а потом вызвать эту функцию. Как в вашем примереcounter()
    • Можно передавать функцию в качестве параметра в другую функцию
    • Функцию можно возвращать из другой функции, как в вашем примере


    Таким образом, хотя данная функция не несёт в себе сложной логики, но она иллюстрирует множество важнейших концепций, без знания которых будет очень тяжело понимать как работают многие бибилиотеки
    Ответ написан
    Комментировать
  • Почему MongoDB работает медленно?

    @Faliah
    В тэгах вижу mongoose. Пара советов по работе с ним: попробуйте поиграться с ограничением полей через find().select(/* объект с полями */). По умолчанию mongoose возвращает коллекцию своих обёрток над JS-объектами, которые довольно тяжелые. Получить POJO можно с помощью find().lean(). Чтобы не ждать, пока вам вернётся вся коллекция из 1500 записей, можно воспользоваться курсорами со стримами и работать с данными пачками.

    Но тут действительно сложно сказать в чём проблема - железо действительно не плохое, но проблема скорее всего в IO цикле, как это обычно и бывает, в зависимости от количества узлов между клиентом, сервером и сервером БД. Может у вас прокси перед сервером стоит и не тянет под нагрузкой, может сервер перегружен запросами и вы ждёте в очереди, может к БД много коннектов и вы, опять же, ждёте.
    Ответ написан
    1 комментарий
  • Как "обойти" асинхронность в данном примере?

    @Faliah
    Ваш первый res.send отправляет все заголовки и тело, что завершает вес процесс запрос-ответ и закрывает возможность использовать текущий объект res для отправки чего-либо. В данном случае вам нужно убрать из кода первый вызов res.send и вы получите "Hello 2". Никаих обходов асинхронности, глобальных переменных и прочего вам не нужно. Переменная res будет и так доступна внутри коллбэка, если вы не перекрываете её где-то в области видимости.
    Ответ написан
    Комментировать
  • Как при нажатии на кнопку выводить всплывающее окно в нужных местах?

    @Faliah
    У каждой формы вы, в дополнение к position: absolute;, можете указать top:0; right: 0;, но контейнер, в котором у вас отображаются формы, должен иметь position: relative;
    Ответ написан
  • Как с помощью regexp удалить все, начиная с определенного символа?

    @Faliah
    "1 августа 2016 г. 19.00".replace(/\w+г\..*/, '')
    Или с trim, чтобы упростить регулярку:
    "1 августа 2016 г. 19.00".replace(/г\..*/, '').trim()
    Ответ написан
  • Как изменять state компонента react js извне?

    @Faliah
    Сначала мне показалось, что это извращение - использовать Реакт, вместо шаблонизатора, как из пушки по воробьям.
    Но, в самом использовании по-моему нет ничего особенного - вот тут собрал вам демку

    Вкратце:
    • Реакт не будет остлеживать состояние глобальных переменных и перерисовывать компонент при их изменении
    • Вместо этого вам нужно воспользоваться lifecycle хуками и, как предлагал коллега выше, внутри этого метода пробросить нужные методы для управления состоянием компонента наружу, хоть в тот же widnow
    • Это позволит вам импользовать одни и те же методы как в дочерних компонентах: обработка клика по оверлею или по кнопке в модальном окне, так и во внешних, по отношению к контексту Реакта, DOM элементах, или, возможно, в каких-то еще бибилиотеках, JQuery и прочих


    Если использовать мой компонент, то нужно немного изменить ваш код:
    ...
      this.on('showModal', function (data) {
        if (!window.modalAttached) {
          ReactDOM.render(
            <ModalWindow data={data} />,
            this.el
          )
        }      
        window.toggleModal();
      }
    ...
    Ответ написан
  • JS: как запретить запуск функции подряд?

    @Faliah
    Используйте debounce, чтобы не использовать дополнительных библиотек, можете взять код вот тут
    Ответ написан
    Комментировать
  • JS есть ошибка?

    @Faliah
    $ - индентификатор, используемый библиотекой jQuery. Вы не подключили эту библиотеку, либо пытаетесь выполнить код до подключения библиотеки
    Ответ написан
  • Как правильно организовать сборку проекта Angular, а также подключение файлов?

    @Faliah
    Гуглите что-то вроде: webpack lazyload с добавлением angularjs и прочих слов. Вот несколько ссылок, что удалось найти:
    • Для начала секция из официальной документации webpack - ссылка
    • Code splitting с примерами - ссылка
    • Lazy load AngularJS with Webpack - ссылка
    • webpack-angular-lazyload - репозиторий с примером - ссылка

    Ответ написан
    1 комментарий
  • Как реализовать тип Vector?

    @Faliah
    Примерно так:
    function Vector(x,y) {
      this.x = x;
      this.y = y;
    }
    Vector.prototype.plus = function(otherVector) {
      var xx = this.x - otherVector.x;
      var yy = this.y - otherVector.y;
      return 'Vector: x= ' + xx + ' y=' + yy;
    };
    Vector.prototype.minus = function(otherVector) {
      var xx = this.x - otherVector.x;
      var yy = this.y - otherVector.y;
      return 'Vector: x= ' - xx - ' y=' - yy;
    };
    
    console.log(new Vector(1, 2).plus(new Vector(2, 3)));
    Ответ написан
  • Какими способами можно сверстать этот блок?

    @Faliah
    А это такое требование, чтобы блоки по краям у вас вылезали за .container из-за position absolute?
    Ответ написан
    Комментировать
  • Инициализация и определение функции Javascript?

    @Faliah
    Вот пример, наглядно демонстрирующий разницу Function Declaration и Function Expression. Основное отличие, на мой взгляд, в том, что function declaration появляется в контексте выполнения раньше всего, отсюда и доступность такой функции в любом месте области видимости. В свою очередь function expression как и остальные expression выполняется, или как в приведенном примере, присваивается значению переменной прямо во время выполнения скрипта, поэтому она доступна только после строки с присвоением и это нужно иметь в виду.
    Ответ написан
    Комментировать
  • Как получить this класса внутри его метода?

    @Faliah
    Контекст this теряется, если ваш метод вызывается не из экземпляра класса, в котором он объявлен. Нужно использовать bind, чтобы привязать функцию к экземпляру.
    const show = element => {
      element.classList.add('show');
    }
    
    class Modal {
      constructor() {
        this.modal = document.get...
      }
    
      open(endAction) {
        show(this.modal);
        
        endAction();
      }
    }
    
    class Slider {
      constructor() {
        this.overlay = document.get...;
      }
    
      openSlider() {
        show(this.overlay);
        console.log(this); // Slider
      }
    
      openModal() {
        const modal = new Modal();
    
        modal.open(this.openSlider.bind(this));
      }
    }


    Или с ES6 стрелочной функцией, результат один и тот же:

    const show = element => {
      element.classList.add('show');
    }
    
    class Modal {
      constructor() {
        this.modal = document.get...
      }
    
      open(endAction) {
        show(this.modal);
        
        endAction();
      }
    }
    
    class Slider {
      constructor() {
        this.overlay = document.get...;
      }
    
      openSlider() {
        show(this.overlay);
        console.log(this); // Slider
      }
    
      openModal() {
        const modal = new Modal();
    
        modal.open(() => this.openSlider());
      }
    }
    Ответ написан
    5 комментариев
  • Как вернуть имя анонимной функции для события?

    @Faliah
    Вернуть имя анонимной функции нельзя, на то она и анонимная. Если бы можно было написать так, как вы хотите, то это в любом случае менее читаемо, чем ваш первый вариант. Вызов инициализирующего кода и привязка обработчиков событий, выполняют разные по своей семантике операции. Мне кажется, что смешивать их - не очень хорошо.

    В верхнем примере ваш код читается как книга - сверху вниз, во втором примере необходимо увидеть IIFE, понять что оно делает и увидеть, что тут же происходит привязка обработчика.

    Плюс каким образом вы будете изменять или тестировать этот обработчик в будущем, если такая необходимость возникнет, а он будет использоваться в обработке разных событий?
    Ответ написан
    Комментировать
  • Как проверить клик по элементу на нативном javascript?

    @Faliah
    Посмотрите пример реализации. На блоке .wrapper висит обработчик 'click' который обрабатывает как клики по самомму элементу, так и по всем дочерним. Для проверки элемента, инициировавшего событие, используется свойство e.target, результат выводится в консоль. Данный код должен корректно работать в IE9+
    Ответ написан
  • Для чего нужен оператор двойное двоеточие ( :: ) в javascript?

    @Faliah
    Похоже вы говорите о сокращенной записи для функции .bind(), которая сейчас входит в ES7 proposal

    Вот несколько ссылок:
    Статья, описывающая работу оператора и его возможн...
    Ответ на SO
    Ответ написан
    Комментировать
  • Есть код счётчиков, как их сложить?

    @Faliah
    Набросал побыстрому решение

    Позвольте отметить несколько моментов:
    1) Вы создаете 3 контроллера с разными названиями, которые делают одно и то же. Видимо вы не понимаете, что каждый раз контроллер инстанциируется независимо от предыдущих. Вам не нужно объявлять отдельную функцию для каждого контроллера
    2) Как уже сказали выше вы можете в данном случае обойтись вообще одним контроллером, либо сделать изолированные компоненты, что сложнее, но зато API будет очень чистый и понятный
    3) Не понятно почему для декремента вы вынесли отдельную функцию, а для инкремента пользуетесь просто eval'ом. Код должен иметь одинаковую структуру и разделен на логические блоки.
    4) Очень много дублирования кода

    Прежде чем лезть в дебри, вам необходимо понять этот базовый пример, иначе дальше будет очень больно

    P.S. Вариант решения, приведенный мной, - один из сотни, наверное.
    Ответ написан
    Комментировать
  • Может ли частое использование transition в css лагать сайт?

    @Faliah
    Для начала, ответ на вопрос - да, частое использование transition в css может лагать сайт

    Анимации могут добатить лагов, если сделаны без понимания сути работы механизма. В частности самыми дешевыми на данный момент (применимо к chrome и частично firefox, не могу сказать за IE и Edge) являются анимации свойств opacity, различные transform: translate, scale, rotate.
    Последнее время в этих вопросах я почитываю различные метериалы от инженера Google Paul Lewis'а, вот ссылки на несколько материалов:
    Статья из его личного блога по animation performance
    Статья по animation performance совместно с Paul Irish
    Нереально крутой туториал по параллаксу, от которо...
    Плейлист в Google Developers на Youtube, где Пол и...
    Ответ написан
    Комментировать