Ответы пользователя по тегу JavaScript
  • 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 комментариев
  • Какими условными операторами лучше воспользоваться если функция имеет 2 определенных сценария и третий сценарий по умолчанию?

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

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