Задать вопрос
  • Как сделать цикл с задержкой?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Если я правильно понял вопрос, то так)
    (function ()
            {
                'use strict';
                if (!confirm('Удалить все лайки?')) return;
                var deleteLikeLink = document.body.querySelectorAll('.like_button_icon');
                setTimeout(()=>{
                   for (var i = 0; i < deleteLikeLink.length; i++)
                   {
                       deleteLikeLink[i].click();
                   }
                }, 1000);
                alert(deleteLikeLink.length + ' likes deleted');
            }());
    Ответ написан
    Комментировать
  • Как запомнить текст, который выполняется в функции?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Основная проблема в получении body заключена в том, что request асинхронный. То есть ответ придет не сразу, а через какое то время, при этом, js не будет дожидаться этого ответа а продолжит выполнять код, находящийся после request-а. Это в свою очередь приведет к тому, что в этом коде мы не можем получить ответ request-а, так происходит потому, что ответ еще не пришел)
    Как же быть в этой ситуации???
    Почитать про ассинхронность, промисы и async/await

    Далее привожу простенький класс, умеющий кэшировать ответы requesta, и пример его использования:
    тык сюда

    var request = require("request");
    
    
    // создаем класс для кэширования результатов запросов
    class СacheRequest {
    	// конструктор
    	constructor(handler){
    		// создаем ассоциативный массив для кэширования результата
    		this.cache = {};
    	}
    	
    	// основной метод класса, предназначен для получения данных по ссылке
    	// принимает url в качестве параметра
    	// возвращает выполненный промис если запрос есть в кэше
    	// или промис в ожидании выполнения запроса
    	async get(url){
    		// если такой запрос уже был, возвращаем промис с результатом из кэша
    		if( this.cache[url] )
    			return  Promise.resolve(this.cache[url]);
    		
    		// иначе возвращаем промис с ожиданием результата
    		return new Promise((resolve,reject)=>{
    			// делаем запрос на указаный url
    			request(url, (error, response, body)=>{
    				// если ошибка - реджектим )
    				if( error )
    					return reject(error);
    				
    				// иначе запоминаем в кэше ответ
    				this.cache[url] = body;
    
    				// и резолвим body
    				resolve(body);
    			});			
    		});
    	}
    
    	// метод отчищает кэш
    	clear(){
    		this.cache = {};
    	}
    }
    
    // создаем экземпляр кэша
    const cacheRequest = new СacheRequest();
    
    // так как request асинхронный, то для того, чтобы получить 
    // результат запроса в "синхронном стиле" используем await
    
    // await можно использовать только внутри асинхронной функции.
    // для этой цели обернем блок с вызовами cacheRequest.get в
    // само вызывающуюся асинхронную функцию
    (async () => {
    	// выполняем запросы:
    	// запросим "http://google.ru/" (будет сделан фактический запрос)
    	let body = await cacheRequest.get("http://google.ru/");
    	console.log("\n\n\nBODY:", body, 111);
    
    	// еще раз запросим "http://google.ru/" (будет взято из кэша)
    	body = await cacheRequest.get("http://google.ru/");
    	console.log("\n\n\nBODY:", body, 222);
    })()
    
    // раз в сутки отчищаем кэш
    setTimeout(()=>{
    	cacheRequest.clear();
    }, 1000*60*60*24 ); // 1000*60*60*24 это количество миллисекунд в сутках

    Ответ написан
    1 комментарий
  • Как вынести за скобку отрицание с или?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    !( orgLawName && company && business && date && base && mber)
    Ответ написан
    Комментировать
  • Как изменить цвет по клику?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Много где:

    1. вместо let u = document.querySelector('.u-p');
    должно быть let u = document.querySelectorAll('.u-p');

    2. вместо this[i].onclick = function() {
    должно быть u[i].onclick = function() {

    3. вместо u.style.color = 'red';
    должно быть u[i].style.color = 'red';

    Разберитесь с циклами и массивами а так-же будьте внимательней.

    let u = document.querySelectorAll('.u-p');
    for (let i = 0; i < u.length; i++) {
      u[i].onclick = function() {
        u[i].style.color = 'red';
      }
    }
    Ответ написан
    Комментировать
  • Как подключить telegram бота в 2 файла?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    В tbot.js производите подключение бота и экспортируете уже подключенного бота (объект полученный при подключении бота)
    В остальных файлах require tbot и работаете уже с подключеным ботом.

    ЗЫ: но не забывайте, что все остальные файлы использующие бота должны запускаться в рамках одного процесса ноды.
    Если же вы будете их запускать по отдельности, это будет эквивалентно запуску нескольких экземпляров вашего бота и у вас опять все сломается.
    Есть несколько способов решения данной проблемы.
    1. Добавить в тбот прокси сервер на сокетах или вэбсокетах который будет содержать API на нужные вам функции бота. Далее из любого скрипта (в том числе и запущенного отдельно) подключаетесь к данному серверу и дергаете необходимые вам функции из API.
    2. Делаете 2х или более разных ботов (каждого со своим токеном)))
    3. Как писал выше, все файлы, использующие бота запускаете в рамках одного процесса, подключая их через require в главном файле проекта.

    ЗЫЗЫ: лично я делал бы по третьему варианту)
    Ответ написан
  • Как работает код?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Потому что
    n-- не тоже самое что n-1
    Первое уменьшает n на единицу и возвращает результат.
    Второе возвращает число на еденицу меньше чем n. При этом само n остается прежним, в результате вы и получаете бесконечный цикл (ведь n не меняется)

    А вот следующие выражения идентичны:
    n=n-1;
    n-=1;
    n--;
    Ответ написан
    3 комментария
  • Почему числа выводятся начиная не с 0 а с 1?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    В этом варианте кода на момент вывода к i уже прибавлена единица. Соответственно вывод начнется со значения 1 и будет 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    var i = 0;
    while (i < 10) {
        i += 1;
        console.log(i)
    }


    А в этом варианте кода на момент вывода i единица еще не прибавлена. Соответственно вывод начнется со значения 0 и будет 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    var i = 0;
    while (i < 10) {
        console.log(i)
        i += 1;
    }
    Ответ написан
    8 комментариев
  • SpeechKit API на JS?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    вариант 1 (взят с qaru)

    Это возможно только при использовании XHR FormData API (ранее известный как часть XHR2 или XHR Level 2, в настоящее время известный как "Расширенные функции XHR" ).

    Учитывая этот HTML,

    <input type="file" id="myFileField" name="myFile" />


    вы можете загрузить его, как показано ниже:

    var formData = new FormData();
    formData.append("myFile", document.getElementById("myFileField").files[0]);
    
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "myServletUrl");
    xhr.send(formData);


    XHR позаботится о правильных заголовках и запросит кодирование тела, и файл в этом примере будет доступен на стороне сервера как form-data с именем myFile.

    Вам нужно иметь в виду, что API FormData не поддерживается в старых браузерах. В caniuse.com вы можете увидеть, что он в настоящее время реализован в Chrome 7+, Firefox 3.5+, Safari 5+, IE 10+ и Opera 12+.


    вариант 2 (взят с qaru)

    (более подробное описание fetch API)

    // Это базовый пример с комментариями. Функция upload - это то, что вы ищете:
    
    // Select your input type file and store it in a variable
    const input = document.getElementById('fileinput');
    
    // This will upload the file after having read it
    const upload = (file) => {
      fetch('http://www.example.net', { // Your POST endpoint
        method: 'POST',
        headers: {
          // Content-Type may need to be completely **omitted**
          // or you may need something
          "Content-Type": "You will perhaps need to define a content-type here"
        },
        body: file // This is your file object
      }).then(
        response => response.json() // if the response is a JSON object
      ).then(
        success => console.log(success) // Handle the success response object
      ).catch(
        error => console.log(error) // Handle the error response object
      );
    };
    
    // Event handler executed when a file is selected
    const onSelectFile = () => upload(input.files[0]);
    
    // Add a listener on your input
    // It will be triggered when a file will be selected
    input.addEventListener('change', onSelectFile, false);




    ЗЫ: не забудьте указать правильные параметры аудиофайла
    Ответ написан
    Комментировать
  • Как переписать обычную функцию в стрелочную?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    var moveDown = () => {
               document.body.scrollTop = 940;
               document.documentElement.scrollTop = 940;
    }
    Ответ написан
    3 комментария
  • Какой язык можно использовать вместо JavaScript на фронтенде?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Существуют. Делятся на 2 группы.

    Первая группа это языки транслируемые с помощью транспилеров в конечном итоге в обычный javascript , такие как typescript и т.д.
    Вторая группа это языки, требующие установки на клиенте специального плагина, например perlscript

    Вот немного про python Running Python in the Browser
    Ответ написан
  • Сортировка, в чем ошибка?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    const arr = [
        { name: "name1", name1: "name2" },
        { name: "Egor", name1: "Fill" },
        { name: "Egorka", name1: "beter" },
        { name: "fullName", name1: "Man" }
    ];
    
    
    const filterList = arr.filter(items =>
        Object.values(items).some(element => element.indexOf("Egor") > -1)
    );
    
    console.log(filterList);


    Сори. Чуть чуть обманул, теперь все верно)))
    на выходе
    [ { name: 'Egor', name1: 'Fill' }, { name: 'Egorka', name1: 'beter' } ]
    Ответ написан
  • Где делать GET запрос в NodeJS или JS?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Если эти данные нужны только для отображения во фронте, делайте запрос во фронте
    Ответ написан
  • Не работает асинхрнонная функция при иморте в js?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Все должно работать. Скорее всего вы не правильно импортируете/экспортируете ваш Reviews.

    Приведите пожалуйста примеры вашего кода:
    1. где вы производите экспорт Reviews
    2. где вы подключаете модуль с Reviews
    3. где вы вызываете Reviews.all(...)

    ошибка в одном из этих кусков кода.

    и хотелось бы увидеть содержимое функции responseBody для того чтобы смоделировать вашу ситуацию.

    ЗЫ: как это обычно и бывает, проблема в невнимательности (тоже иногда этим грешу)))
    res.body неопределен, вот и возвращает undefined

    замените в файле agent.js
    const responseBody = res => res.body;

    на
    const responseBody = res => res.data;

    вот пример

    agent.mjs
    import axios from 'axios';
    
    const API_ROOT = 'http://api.startgiven.ru:8080/stargiven-1.0/api';
    const API = api => `${API_ROOT}${api}`;
    
    const responseBody = res => res.data;
    
    const handleError = err => {
      if (err && err.response && err.response.status === 401) authStore.logout();
    };
    
    const request = {
      get: url =>
        axios
          .get(API(url))
          .catch(err => console.log(err))
          .then(responseBody)
    };
    
    const Reviews = {
      all: () => request.get('/comments')
    };
    
    export { Reviews };


    test.mjs
    import { Reviews } from './agent.mjs';
    
    console.log("test1:", Reviews );
    console.log("test2:", Reviews.all().then(a=>{
        console.log("test3:", a);
    }) );


    результат выполнения
    $ node --experimental-modules test.mjs 
    (node:2668) ExperimentalWarning: The ESM module loader is experimental.
    test1: { all: [Function: all] }
    test2: Promise { <pending> }
    test3: [
      {
        description: 'Все круто, очень. Молодцы!',
        email: 'ivanivanov@gmail.com',
        firstName: 'Иван',
        id: 10,
        lastName: 'Иванов',
        rate: 5,
        status: 0
      },
      {
        description: 'Все круто, очень. Молодцы!',
        email: 'ivanivanov@gmail.com',
        firstName: 'Иван',
        id: 11,
        lastName: 'Иванов',
        rate: 6,
        status: 0
      },
      {
        description: 'Все круто, очень. Молодцы!',
        email: 'ivanivanov@gmail.com',
        firstName: 'Иван',
        id: 12,
        lastName: 'Иванов',
        rate: 6,
        status: 0
      },
      {
        description: 'Все круто, очень. Молодцы!',
        email: 'ivanivanov@gmail.com',
        firstName: 'Иван',
        id: 13,
        lastName: 'Иванов',
        rate: 6,
        status: 0
      },
      {
        description: 'Все круто, очень. Молодцы!',
        email: 'ivanivanov@gmail.com',
        firstName: 'Иван',
        id: 14,
        lastName: 'Иванов',
        rate: 6,
        status: 0
      },
      {
        description: 'СУПЕР',
        email: 'info@3peaks.cloud',
        firstName: 'Aline',
        id: 15,
        lastName: 'Basdasd',
        rate: 5,
        status: 0
      },
      {
        description: 'СУПЕР',
        email: 'info@3peaks.cloud',
        firstName: 'Aline',
        id: 16,
        lastName: 'Basdasd',
        rate: 5,
        status: 0
      },
      {
        description: 'СУПЕР',
        email: 'info@3peaks.cloud',
        firstName: 'Aline',
        id: 17,
        lastName: 'Basdasd',
        rate: 5,
        status: 0
      },
      {
        description: 'СУПЕР',
        email: 'info@3peaks.cloud',
        firstName: 'Aline',
        id: 18,
        lastName: 'Basdasd',
        rate: 5,
        status: 0
      }
    ]
    Ответ написан
  • В игре crowd city графика 2d или 3d?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Это чистое 3D. Просто камера вида установленна под углом сверху.
    5d75422d0bc18980631340.jpeg

    Чтобы добиться такого же эффекта Вам надо прочитать/разобраться про позиционирование и управление камерой вида. Об этом можно почитать в документации к игровому движку выбранному вами. Если игру вы делаете на юнити то вот
    Ответ написан
    Комментировать
  • Не стыковка в вопросе на тестовое задание яндекс contest?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    cost = l / (s > 28 ? 28 : s)
    Ответ написан
  • Как остановить выполнение функции с помощью clearTimeout?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем


    В данной задаче вам не нужно делать clearTimeout. Тут просто при counter>phrases.length не нужно запускать setTimeout(next, 2000);
    Все исправления внутри функции next()
    Ответ написан
    1 комментарий
  • Как обрабатывать файлы не сервере правильно?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Как быть в случае, если путь до файла должен быть динамическим, например, по дням недели?

    Получая файл, в обработчике multer-а перемещаете файл в нужную вам папку (и переименовываете при необходимости). Это можно сделать как выполнив из ноды команду ОС (*nix, win), так и средствами самой ноды

    Выглядеть это будет примерно так:
    // роутер Express-а ./routes/files
    var fs = require('fs');
    var express = require('express');
    var router = express.Router();
    
    
    // получаем файлы
    var multer = require('multer');
    var upload = multer({ 
    	dest:'./folder_for_upload_files/'
    	// прочие опции
    }).single("upload");
    
    router.post('/files/upload', function(req, res, next) {
    	upload(req, res, function (err) {
    		if (err){
    		   // обработка ошибки
    		   // и завершение обработки запроса res.end() или res.send(...)
    		   return;
    		}
    		
    		// если же загрузка произошла успешно, то
    		// 1. определяем в какую папку и под каким именем переместить файл
    		// 2. перемещаем файл в нужную папку
    		// 3. делаем об этом запись в БД или в файлики или кудато еще (в место предназначенное для хранения этой информации)
    		// 4. завершаем обработки запроса ( res.end() или res.send(...) )
    		
    		// в помощь:
    		// req.file.originalname - оригинальное имя  файла на компе клиента
    		// req.file.filename - имя загруженного в "./folder_for_upload_files/" файла
    		
    		
    	});
    });
    
    
    module.exports = router;
    Ответ написан
    Комментировать
  • Эта регулярка не запрещает ввод других символов, а как запретить?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    olya_097, еще раз здравствуйте. Ваш вопрос слегка не полон, поэтому попробую догадаться в чем дело.
    эта регулярка не запрещает ввод других символов

    Догадка: видимо Вы используете какую то библиотеку/плагин в котором можно задавать с помощью регулярки фильтр вводимых данных для полей вода типа input и textarea.
    Если это так, то хотелось бы узнать что это за библиотека/плагин и тогда возможно понять в чем причина.
    Если же Вы пользуетесь обычным input и/или textarea и при этом не используете никаких библиотек/плагинов, расширяющих их функционал, то скорее всего вы имеете небольшой самописный кусок js кода, который через регулярку проверяет введенный текст (или вводимый текст) и что то там дальше делает. Если это так, то хотелось бы увидеть этот кусок кода вместе с частью разметки, включающей в себя контролируемые кодом поля ввода и тогда, я уверен, мы сможем Вам помочь разобраться с решением Вашего вопроса.
    Ответ написан
    7 комментариев
  • Хорошее ли решение - для каждой страницы сайта писать JS в замыканиях?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Вынести из глобальной области видимости код, предназначеный для разового использования на отдельновзятой странице всегда хорошая идея, а вот наилучший способ, которым вы это будете делать будет зависеть от множества факторов, таких как общая архитектура приложения, частота посещения конкретной страницы и даже способа ее загрузки и отображения. Но в целом ДА, изолировать области видимости таких кусков кода является хорошей практикой, позволяющей избежать многих пикантных ситуаций)
    Ответ написан
    Комментировать
  • Как заставить все запросы ждать один промис?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Как подсказал Inviz Custos, очередь решит вашу проблему (если конечно правильно будет работать с дублирующими запросами и промисами)

    Вот простенький рабочий пример
    // внутри async function
    let quiz = global_quizzes[quiz_id];
    if(!quiz) {
        global_quizzes[quiz_id] = quiz = Chat_Quizzes.findById(quiz_id).exec();
    }
    
    if( quiz instanceof Promise ){
        global_quizzes[quiz_id] = quiz = await quiz;
    } 
    chat.quiz = quiz;


    PS: правда это не совсем очередь, но ваш global_quizzes в некоторой степени ее имитирует.
    Ответ написан
    2 комментария