• Наследование и EventEmitter?

    Xuxicheta
    @Xuxicheta
    инженер
    Вы конечно можете отнаследовать и сделать this.on('event') в конструкторе B, но это будет какой-то ерундой, объект который сам себя слушает. Зачем это делать, если можно вызвать сразу метод.

    А объект, который слушает одно из своих свойств - вполне нормально, делайте как написали.
    Ответ написан
    Комментировать
  • Как упростить данный код?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сделать объект, где ключами и значениями будут возможные значения stage и соответствующие им значения, передаваемые в emit первым параметром:

    const STAGES = {
      2: 'itemGv',
      5: 'itemTm',
    };

    После этого множество условных операторов внутри цикла можно заменить на один - извлекаем из объекта значение, проверяем, что оно не мусор:

    for (const [ key, val ] of Object.entries(items)) {
      const s = STAGES[val.stage];
      if (s) {
        this.client.srem('items', key);
        this.emit(s, val);
      }
    }
    Ответ написан
    Комментировать
  • Как сделать обработчик события только при условии?

    coderisimo
    @coderisimo
    Возможно несколько решений.
    Например, что мешает уже в обработчике смотреть есть ли block.data == true. Передавать block.data прямо в обработчик ? И уже в обработчике смотреть block.data == true? Если нет - обработчик дальше не работает, если да , то делает свое дело.

    Есть еще возможность присваивать обработчик в зависимости от какого-то условия, т.е

    <div id="app">
      <button @click="bool ? one() : two()">Click</button>
    </div>


    Вот пример, где обработчик вешается не на все элементы, а только на те что удовлетворяют условию:

    Ответ написан
    7 комментариев
  • Почему стоимость клика различается?

    DeoZ
    @DeoZ Куратор тега Яндекс.Директ
    Веб-разработка и Реклама
    1. Прогноз - это прогноз.
    2. Прогноз - это средняя величина за последние 30 дней. В интерфейсе - то, что происходит в данный момент.
    3. При первом запуске кампаний цифры по стоимости за объём трафика могут быть завышены. Спустя несколько часов они приходят в норму.
    4. Стоимость за объём трафика сильно зависит от ваших объявлений, сайта, соответствии запросам.
    Вообще по скриншотам не видно полностью ли у вас идентичны условия в инструменте прогнозирования и уже в кампании. Регионы, точность соответствия запросов.
    Верьте, конечно, интерфейсу. И, чем большее количество запросов Вы используете для прогнозирования, тем ближе к реальности будет итоговая средняя цифра по бюджету и стоимости клика. Но и в этом случае не надо исключать факторы сезонности.
    Ответ написан
    2 комментария
  • Как одной строчкой кода вытащить...?

    zendor
    @zendor
    myCrazyObject['some array'][2].number;

    Или более универсальный вариант:
    const traverse = (path, obj) => path.split('.').every(k => obj[k] && (obj = obj[k])) ? obj : null;
    traverse('some array.2.number', myCrazyObject); //123
    Ответ написан
    3 комментария
  • Как вытащить из строки определенную часть?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Можно достать последовательность подходящих символов, расположенную в конце строки:

    str.match(/\w+$/)[0]

    Или, порезать строку на куски, использовав качестве разделителей неподходящие символы, и взять последний кусок:

    str.split(/\W/).pop()

    Или, удалить максимально длинную последовательность символов, оканчивающуюся неподходящим символом:

    str.replace(/.*\W/, '')

    Или (дикий вариант), ищем максимальный индекс мусорного символа, вырезаем кусок строки, начиная со следующего (если нигде ничего не найдено, везде -1, с единицей это 0, т.е., начало строки) и до конца:

    str.slice(1 + Math.max(...[...'@/'].map(n => str.lastIndexOf(n))))

    Или (тоже дикий вариант), перебираем строку, добавляем символы в результат, если символ мусорный - сбрасываем результат:

    [...str].reduce((acc, n) => '@/'.includes(n) ? '' : acc + n, '')
    Ответ написан
    2 комментария
  • Технологии для браузерного чата?

    Вам нужен websocket
    Ответ написан
    Комментировать
  • Почему через некоторое время не работают все mysql-сесии?

    @BorisKorobkov Куратор тега MySQL
    Web developer
    До недавнего времени все было нормально. Сейчас перешел с пива на водку. На утро сильно болит голова (зависит от количества выпитого). Единственная версия - интоксикация. После через некоторое время после опохмела прихожу в себя. Но после нескольких литров выпитой водки опять начинает кружиться голова. До перехода с пива на водку голова так сильно не болела.

    Коннекты создаются, но не закрываются. Когда их кол-во достигает лимита - mysql падает.
    transaction.release() не срабатывает, потому что у вас каша из попыток писать синхронный код на асинхронном языке. Await на каждой строчке - это говнокод. Понапихать еще await'ов в connection.release() - это не решение проблемы, а костыль. В таком стиле можно писать на PHP, но для использования Node.JS сначала разберитесь с асинхронностью.
    Ответ написан
    2 комментария
  • Вопрос по поводу mysql транзакций?

    megafax
    @megafax
    web-программист
    1) Да, блокировки снимутся после окончания транзакции
    2) В зависимости от того, как у Вас настроен клиент и какие действия будут выполнены по отсоединению. По умолчанию, насколько помню, при дисконнекте будет выполнен COMMIT, потому делать ROLLBACK обязательно.
    Ответ написан
    3 комментария
  • Как использовать mysql транзакции вместе с async/await?

    Negezor
    @Negezor
    Senior Shaurma Developer
    Если я всё правильно понял, то так:
    const { promisify } = require('util');
    
    /* ... */
    
    const query = promisify(connection.query).bind(connection);
    const commit = promisify(connection.commit).bind(connection);
    const rollback = promisify(connection.rollback).bind(connection);
    const beginTransaction = promisify(connection.beginTransaction).bind(connection);
    
    /* ... */
    
    async function run(title) {
    	try {
    		await beginTransaction();
    
    		const { insertId } = await query('INSERT INTO posts SET title=?', title);
    
    		const log = `Post ${insertId} added`;
    
    		await query('INSERT INTO log SET data=?', log);
    
    		await commit();
    
    		console.log('Success!');
    	} catch (e) {
    		await rollback();
    	}
    }
    Ответ написан
    5 комментариев
  • Распространение цикла на соседние блоки Vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Ну, очевидно, v-for имеет более высокий приоритет, вот и выполняется в обоих случаях.

    Что делать? Добавьте элементу с v-for обёртку, в которую и перенесите v-if.
    Ответ написан
    Комментировать
  • Как отдавать assets через webpack по конкретной дирректории?

    @kacheleff
    fullstack developer
    нужно настраивать output.path
    например, при таком значении path: path.join(__dirname, './dist')
    все файлы будут в папке dist, которая находится рядом с webpack.config.js
    Веб-сервер раздает файлы уже из этой папки
    Ответ написан
    1 комментарий
  • Адекватный ли конструктор?

    rockon404
    @rockon404
    Frontend Developer
    Не понимаю назначения этой сущности, но это не конструктор. Метод viewer назван неправильно, так как название не говорит ничего о том, что этот метод делает.
    Конструкгор это когда так:
    spoiler
    function SetUserManager(config) {
      this.client = new ClientUser();
      this.clientManager = new ClientManager({
        user: this.client
      });
    
      this.options = {
        name: config.name,
        key: config.key
      };
    
      this.cookies = [];
    
      client.login(options);
      this.viewer();
    }
    
    SetUserMagager.prototype.viewer = function() {
      this.client.on('login', () => {
        this.client.setLogin();
      });
    
      this.client.on('msg', (session) => {
        serveSession(session);
      });
    
      this.clientManager.on('user', (data) => {
        serveNewUser(data);
      });
    }

    или так:
    spoiler
    class SetUserMagager {
      constructor(config) {
        this.client = new ClientUser();
        this.clientManager = new ClientManager({
          user: this.client
        });
    
        this.options = {
          name: config.name,
          key: config.key
        };
    
        this.cookies = [];
    
        client.login(options);
        this.viewer();
      }
      
      viewer() {
        this.client.on('login', () => {
          this.client.setLogin();
        });
    
        this.client.on('msg', (session) => {
        	serveSession(session);
        });
    
        this.clientManager.on('user', (data) => {
          serveNewUser(data);
        });
      }
    }

    Складывается впечатление, что вы везде пытаетесь использовать ООП и плодите сущности там, где они не нужны и где лучше использовать функциональный стиль.

    Насчет ваших обработчиков ничего не скажешь так как не ясно, ни что такое ClientUser и ни что такое ClientUserManager.
    Ответ написан
    2 комментария
  • Как отловить событие загрузки разметки во Vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Есть такая штука - nextTick. С ёё помощью можно вызвать функцию после обновления DOM-дерева. Т.е., делайте так:

    this.stage = 1;
    this.$nextTick(() => {
      const elem = document.querySelector('.elem');
      ...
    });
    Ответ написан
    Комментировать
  • Как сделать плавность анимации?

    @GreatRash
    Вместо изменения свойства top нужно менять свойство translate. В этом случае при анимации будет задействована видеокарта и она будет сильно плавнее.
    Ответ написан
    4 комментария
  • Почему не работает анимация во Vue.js?

    dimovich85
    @dimovich85 Куратор тега CSS
    https://u-academy.net/
    Проставьте элементам аттрибут key.
    https://ru.vuejs.org/v2/guide/transitions.html
    Найдите там подзаголовок про переключение элементов, и в красной рамке будет комментарий. Без key для watchera как бы нет изменений, а когда у элементов есть разные keys, то видно изменение, и происходит анимация.
    Ответ написан
    Комментировать
  • Как убрать отображение исходников из панели разработчика?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    В конфиге webpack задать devtool: false.
    Ответ написан
    Комментировать
  • Почему не обновляется список при изменении данных во Vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Vue не отслеживает добавления свойств объектов. Назначайте значения свойств selectedItems с помощью $set.

    Т.е., вместо

    this.selectedItems[itemName] = item

    делайте так

    this.$set(this.selectedItems, itemName, item)

    Ну и соответственно, $delete - для удаления свойств.
    Ответ написан
    4 комментария
  • Как на лету в цикле добавлять класс во Vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    А что такое item_not_sale - это имя класса, или свойство, содержащее в себе имя класса?

    Если имя - в первом варианте забыли кавычки, если свойство - второй вариант добавляет не значение свойства, а его имя.

    Также неясно, что такое item, есть ли среди этих item'ов такие, которые содержат status равный 2.

    В общем - маловато информации, чтобы определённо сказать, где вы ошиблись.
    Ответ написан
    3 комментария