• Для чего нужен middleware?

    RomReed
    @RomReed
    JavaScript, Flutter, ReactNative, Redux, Firebase
    Почему нельзя? можно. Но вы должны понимать что как только компонент размонтируется вы потеряете данные. По этому делают запросы обычно в redux actions и хранят полученные данные в redux. Таких образом пока у вас есть удобный доступ к полученным данным из разных компонентов + вам не надо делать повторно запрос потому что они у вас уже лежат в redux.
    А middleware это просто прослойка между диспатчем и моментом когда данные будут положены в редукс. В этот момент вы можете например навесить еще какую то логику. Например проверить токен сервера на то что он еще не истек и если истек выкинуть на авторизацию или сделать запрос на обновление.
    Ответ написан
  • Как форматировать кол-во минут в корректное время?

    twobomb
    @twobomb
    var time =  "10:25";
    var duration = 1232 ;
    const hour = Math.floor(duration / 60);
    const min = duration - hour * 60;
    let hs = parseInt(time.split(":")[0]);
    let ms = parseInt(time.split(":")[1]);
    let he = (hs + hour + Math.floor((min+ms)/60))%24;
    let me = (min+ms)%60;
    alert(`${hour}:${min} - ${he}:${me}`)
    Ответ написан
  • Как форматировать кол-во минут в корректное время?

    bingo347
    @bingo347 Куратор тега JavaScript
    Бородатый программер
    Время отправки переведите в минуты по формуле hours * 60 + minutes, например для 10:25 будет 10 * 60 + 25.
    Прибавьте к результату время в пути в минутах (duration)
    Вычислите из результата нормальное время. Я бы еще учел, что время может перейти на следующие сутки, проще всего для этого часы брать как остаток от деления на 24. И минуты выделять тоже проще через остаток:
    const hours = Math.floor(finishTime / 60) % 24;
    const minutes = finishTime % 60;

    Ну и наконец, стоит не забывать, что минуты могут получится меньше 10, и тогда для нормализации нужно будет еще дописать к ним ведущий 0
    Ответ написан
  • Как форматировать кол-во минут в корректное время?

    Gimir
    @Gimir
    JavaScript dev
    Если нужно получить стороны строки '10:05'
    let timeArr = '10:05'.split(':'); // ['10', '05']
    Ответ написан
  • Как форматировать кол-во минут в корректное время?

    @ivashjke
    Vue JS, React, React Native
    если по быстрому то так
    const initTime = '10:25',
    duration = 1232;
    const [initHour, initMin] = initTime.split(':');
    const calc = parseInt(initHour)*60 + parseInt(initMin) + 1232;
    
    let hour = Math.floor(calc/60); let hourSave = hour;
    if (hour > 23) hour -= 24; //ну или если перелет вдруг больше суток еще условия
    const min = calc - (hour < hourSave ? hourSave : hour) * 60;
    
    console.log(`${initTime} - ${hour}:${min}`);

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

    bingo347
    @bingo347 Куратор тега JavaScript
    Бородатый программер
    Ваша главная проблема в говнокоде, в котором Вы сами не в состоянии разобраться.

    Для начала я отрефакторю вот этот кусок:
    const minSalary = Math.min(...employeeData.map(({ salary }) => salary));
    minSalaryEmployee = employeeData.filter(({ salary }) => {
        return salary === minSalary;
    });
    const [id, oldSalary] = [
        minSalaryEmployee[0].id,
        minSalaryEmployee[0].salary,
    ];
    const newSalary = oldSalary + (oldSalary / 100) * 20;
    return { id: id, salary: newSalary };
    ибо тут твориться полная жесть...
    Если привести в более читабельный вид:
    const minSalary = Math.min(...employeeData.map(({salary}) => salary));
    const minSalaryEmployee = employeeData.find(({salary}) => salary === minSalary);
    const {id, salary: oldSalary} = minSalaryEmployee;
    const newSalary = oldSalary + (oldSalary / 100) * 20;
    return {id, salary: newSalary};
    то сразу можно увидеть простор для оптимизации поиска минимума:
    const [minSalaryEmployee] = employeeData.reduce(([minEmployee, minSalary], employee) => {
        const {salary} = employee;
        return (salary < minSalary
            ? [employee, salary]
            : [minEmployee, minSalary]
        );
    }, [null, Infinity]);
    А заодно и формулу
    const newSalary = oldSalary + (oldSalary / 100) * 20;
    применив алгебру за 5 класс можно упростить доconst newSalary = oldSalary * 1.2;

    Следующим шагом стоит развернуть все промисы. Вообще вкладывать промисы в друг друга не очень хорошая идея. Наличие .then внутри колбэка другого .then или колбэка-раннера new Promise - воняет очень скверно.

    Немного поколдовав, заодно исправив ошибки с колбэками .then без return, получаем более читабельный, а главное работающий код:
    function increaseSalary() {
        return api.getEmployees()
            .then(employeeData => {
                const [minSalaryEmployee] = employeeData.reduce(([minEmployee, minSalary], employee) => {
                    const {salary} = employee;
                    return (salary < minSalary
                        ? [employee, salary]
                        : [minEmployee, minSalary]
                    );
                }, [null, Infinity]);
                const {id, salary: oldSalary} = minSalaryEmployee;
                const newSalary = oldSalary * 1.2;
                return {id, salary: newSalary};
            })
            .then(({id, salary}) => api.setEmployeeSalary(id, salary))
            .then(({name, id, salary}) => api.notifyEmployee(id, `Hello, ${name}! Congratulations, your new salary is ${salary}!`))
            .catch(e => api.notifyAdmin(e));
    }


    P.S. я бы еще бил все это добро на отдельные функции, ибо complexity 10 это все еще много...

    import api from 'path/to/api';
    
    export function increaseSalary() {
        return api.getEmployees()
            .then(findEmployeeWithMinSalary)
            .then(calculateNewSalary)
            .then(setEmployeeSalary)
            .then(notifyEmployee)
            .catch(notifyAdmin);
    }
    
    function findEmployeeWithMinSalary(employeeData) {
        const [minSalaryEmployee] = employeeData.reduce(minSalaryEmployeeReducer, [null, Infinity]);
        return minSalaryEmployee;
    }
    
    // Complexity is 3 - это самая сложная функция
    function minSalaryEmployeeReducer([minEmployee, minSalary], employee) {
        const {salary} = employee;
        return (salary < minSalary
            ? [employee, salary]
            : [minEmployee, minSalary]
        );
    }
    
    function calculateNewSalary({id, salary}) {
        return {
            id,
            salary: salary * 1.2
        };
    }
    
    function setEmployeeSalary({id, salary}) {
        return api.setEmployeeSalary(id, salary);
    }
    
    function notifyEmployee({name, id, salary}) {
        return api.notifyEmployee(id, `Hello, ${name}! Congratulations, your new salary is ${salary}!`);
    }
    
    function notifyAdmin(e) {
        return api.notifyAdmin(e);
    }
    Ответ написан
  • Как выбросить ошибку из промиса?

    @twoone
    function increaseSalary() {
      return new Promise((resolve, reject) => {
        let minSalaryEmployee = Promise.resolve().then((employeeData) => {
          return { };
        });
        minSalaryEmployee
          .then((data) => {
            let newSalary = Promise.reject();
            newSalary
              .then((newData) => {
                resolve(`Ok`);
              })
              .catch((e) => {
                reject(`Error`)
              });
          })
          .catch(reject);
      });
    }
    
    increaseSalary()
      .then(console.log)
      .catch(console.error);
    Ответ написан
  • Как обернуть данные из колбэков в массив?

    bingo347
    @bingo347 Куратор тега JavaScript
    Бородатый программер
    Решение 0xD34F имеет сложность O(n2) из-за использования метода every
    Если это тестовое задание, могут и придраться, так как обычный счетчик позволяет решить со сложностью O(n)
    function getUsersInfo(ids, callback) {
      const {length} = ids;
      const results = Array(length);
      let doneCount = 0;
      ids.forEach((id, i) => {
        getUserInfo(id, user => {
          results[i] = user;
          doneCount++;
          if(doneCount === length) {
            callback(result);
          }
        });
      });
    }

    Ну и замечу, что Promise.all в v8 под капотом использует именно такой подход (разве что подсчет ведут от length к 0):
    https://github.com/v8/v8/blob/master/src/builtins/...
    Ответ написан
  • Как обернуть данные из колбэков в массив?

    0xD34F
    @0xD34F Куратор тега JavaScript
    В коллбеке получения одного элемента данных после его записи в массив результатов проверять, что получено всё - если да, тогда вызывать общий коллбек:

    function getUsersInfo(ids, callback) {
      const results = [...Array(ids.length)];
    
      ids.forEach((n, i) => {
        getUserInfo(n, user => {
          results[i] = user;
    
          if (results.every(Boolean)) {
            callback(result);
          }
        });
      });
    }
    Ответ написан
  • Как вызвать функцию определённое кол-во раз?

    @Nc_Soft
    let attempts = 0;
    do {
    attempts++;
    try {
    //call function here, if success break
    }
    catch (e) {
    }
    }
    while(attempts < 5)
    Ответ написан
  • Как вызвать функцию определённое кол-во раз?

    OxCom
    @OxCom
    Условия выброса исключений расставьте на свой вкус.
    let getData = (attempts) => {
        if (attempts < 1) {
            return Promise.reject('Max attempts reached.');
        }
    
        return new Promise((res, rej) => {
            console.log('Attempt to fetch data: #' + attempts);
            attempts == 1 
                ? setTimeout(() => {res('This is my data')}, 3000) 
                : setTimeout(() => {rej('Shit happens')}, 3000);
        }).catch(e => {
            return getData(attempts - 1);
        })
    }
    
    getData(3)
        .then(r => console.info('=> ' + r))
        .catch(e => console.error(e));
    Ответ написан
  • EventEmmiter, вызвать все обработчики всех событий?

    @StockholmSyndrome
    class BroadcastEventEmitter extends EventEmitter {
        emit(event, ...args) {
            if (event === '*') {
                Object.keys(this.events).forEach((e) => super.emit(e, ...args));
            } else {
                super.emit(event, ...args);
            }
        }
    }
    Ответ написан