• Как указать что аргумент функции - это значение из массива?

    Думаю, что завязываться на строковые константы - порочная практика. Хотя бы потому что не удобно - нет подсказок в IDE и сложно рефакторить.

    В вашем случае идеально бы подошёл enum:

    enum EField {
      Name = 'name',
      Age = 'age',
      Surname = 'surname',
    };
    
    const arr = [EField.Name, EField.Age, EField.Surname];
    
    const obj: {[K in EField]?: any} = {}
    const prepareFn = (key: EField) => { obj[key] };
    
    prepareFn(EField.Name);
    prepareFn(EField.Age);
    Ответ написан
    Комментировать
  • Await не работает с обычными функциями?

    async-await - это синтаксический сахар над генераторами и промисами, как yield можно использовать только в генераторе, так и await можно использовать только в функциях, объявленных с async.

    А сам await можно использовать с чем угодно, не только с функциями, которые возвращают промис, вот этот код тоже абсолютно корректен и работает как ожидается:

    async function foo() { 
      console.log(await 1);
    }
    Ответ написан
    1 комментарий
  • Как обратиться к методу в классе из вне?

    Ошибка вот здесь

    $(document).ready(function(){
     let myCustomClass = new MyCustomClass();
    })


    переменная myCustomClass объявлена в контексте функции и не доступна за её пределами, а код в обработчике onclick="myCustomClass.myCustomMethod()" ожидает, что это будет глобальная переменная.
    Чтобы поправить ошибку, достаточно объявить переменную вот так:

    // без document.ready
    window.myCustomClass = new MyCustomClass();


    Но это будет НЕ правильным решением, потому что:
    1. Не нужно смешивать разметку и код, обработчик на onclick нужно вешать через js
    2. Не нужно использовать глобальные переменные, в больших проектах это чревато багами
    3. Если используете JQuery, то делайте всё через него, не смешивайте разные подходы.

    Воспользуйтесь кодом в примерах от Uneasy Hearts Weigh the Most
    Ответ написан
    Комментировать
  • Как преобразовать Promis.all в последовательные запросы?

    Как советуют выше, проще всего использовать async-await и цикл for-of, но если нет возможности их использовать, то тогда можно просто построить цепочку промисов, примерно вот так:
    const promises = [
      Promise.resolve("first"), 
      Promise.resolve("second"), 
      Promise.resolve("last")
    ];
    
    function makePromiseChain(arrayOfPromises) {
      return arrayOfPromises.reduce((acc, current) => acc.then(() => current, Promise.resolve()));
    }
    
    makePromiseChain(promises).then(() => {
      console.log("done");
    });


    Если хочется часть запросов выполнять параллельно, например: первые 3 запроса параллельно, затем следующие 3 параллельно и т.д., то можно массив промисов разбить на чанки:

    // если в проекте есть lodash, то в нём есть метод _.chunk
    function makeChunks(array, chunkSize) {
      const chunks = [];
      for (let i = 0, j = array.length; i < j; i += chunkSize) {
        const chunk = array.slice(i, i + chunkSize);
        chunks.push(chunk);
      }
      return chunks;
    }
    
    // выполняем запросы параллельно по 3 штуки
    makePromiseChain(
      makeChunks(promises, 3)
        .map(chunk => Promise.all(chunk))
    ).then(() => console.log('Done'))
    Ответ написан
    Комментировать
  • Как объединить функции слайдера по таймеру и по клику?

    Проведите рефакторинг. Выделите одну функцию, которая будет отвечать за смену баннера. Передавайте этой функции необходимые для работы параметры. Вызывайте её в обоих случаях, и при смене по таймауту, и при смене по клику.
    Ответ написан
    5 комментариев
  • Как задать text-decoration-color для input?

    По-умолчанию input не наследует свойства родительского элемента. Нужно заставить его это сделать.
    jsfiddle.net/LvHWk/1
    Ответ написан
    3 комментария
  • Какими условными операторами лучше воспользоваться если функция имеет 2 определенных сценария и третий сценарий по умолчанию?

    Лучше написать отдельные методы для каждой ситуации.
    // популярные книги
    function get_popular_books();
    // новые книги
    function get_new_books();
    // книги с дефолтными параметрами
    function get_books();

    и в зависимости от ситуации пользоваться необходимым.
    Ответ написан
    Комментировать
  • Как вставить картинку без потери качества

    Задайте для картинки размеры при её выводе. Когда ваш скрипт генерирует изображение, он ведь может определить его размеры? Так вот и вставьте эти размеры в атрибуты width и height тега img, а также продублируйте и в инлайн-css.
    Ответ написан
  • Как блокировать и проверять забаненные ip? PHP?

    Согласен с другими комментаторами. Защиту нужно реализовывать не на php, а средствами сервера. Однако уж если совсем приспичило, то можно сделать что-нибудь а-ля vitalykim.ru/zashhita-ot-ddos-atak-na-php.html
    И реализовать вызов проверки на ddos в конструкторе MY_Controller и наследовать все контроллеры от него, или реализовать хук pre_controller.
    Ответ написан
    Комментировать
  • Как кроссбраузерно выровнить три фигуры на css по вертикали?

    Попробуйте вот так:
    jsfiddle.net/hHCP8
    Ответ написан
    Комментировать
  • Как вывести текст из MySQL без непечатаемого пробела (& nbsp; )?

    Проблема возникает из-за того, что разбиение на страницы происходит для фиксированного количества символов.
    $text = substr($data['text'], $i*850, 850);
    Этот код не знает о том, что & nbsp; это один символ. Поэтому амперсанд оказывается на одной странице, а код nbsp; на другой.

    Чтобы решить проблему, придется усложнить алгоритм. Например, можно разбить текст на слова, и выводить на одной странице слова, сумма длин которых в сумме с количеством разделителей слов не превышает заданное у вас в коде число 850.

    Самое простейшее решение, разбить текст на слова с помощью explode(), более интеллектуальное решение можно реализовать, используя preg_split() и регулярные выражения.

    // формируем массив слов
    // считаем, что все слова разделены пробелом
    $words = explode(' ', $data['text'])
    // далее должен идти код, который определит
    // какие слова будут выведены на этой странице


    Таким образом, у вас не получится разделить символ & nbsp; и другие спецсимволы на две страницы. Надеюсь, что новый алгоритм разбиения вы сможете написать самостоятельно.

    P.S. А самое простое и грубое решение, избавиться вообще от источника проблемы:
    $data['text'] = html_entity_decode($data['text'], ENT_NOQUOTES);

    Документация здесь: www.php.su/functions/?html-entity-decode

    UPD. Набросал недостающий кусок кода. Не тестировал, но должно работать.

    <?php 
    while ($data = mysql_fetch_array($qr_result)) {
     $count_pages = ceil(strlen($data['text']) / 850);
    // разбиваем текст на слова
     $words = explode(' ', $data['text']);
    // начинаем вывод с первого слова
     $current_word_index = 0;
    // формируем текст страницы
    $page_text = '';
     while ($current_word_index < count($words)){
    	 // если длина текущего текста страницы
    	 // плюс пробел плюс следующее слово меньше 850
    	if (strlen($page_text . $words[$current_word_index] . ' ') <= 850){
    		// добавляем слово с пробелом к тексту
    		$page_text .= $words[$current_word_index] . ' ';
    		// переходим к следующему слову
    		$current_word_index++;
    	}
    	else{ // в противном случае выводим страницу
    	?>
    	<div>
    		<p><?=$page_text?></p>
    	</div>
    	<?	
    		// 
    		$page_text = '';
    	}
    	// если мы дошли до последнего слова, то выводим весь оставшийся текст
    	if ($current_word_index == count($words) - 1){
    		?>
    		<div>
    			<p><?=$page_text . ' ' . $words[$current_word_index]?></p>
    		</div>
    		<?
    	}
      }
    } ?>
    Ответ написан
    7 комментариев
  • Каковы основные критерии многопользовательского приложения?

    1. Надежность и отказоустойчивость (разделение прав доступа, бекапы, разрешение конфликтов и т.д. и т.п.)
    2. Стоимость внедрения в соотношении с функционалом
    3. Производительность (включая максимальное время отклика, сетевую нагрузку и т.д.)
    4. Удобство интерфейса (как административного, так и пользовательского)
    Ответ написан
    Комментировать