Как обернуть данные из колбэков в массив?

Коллеги, всем привет!

Помогите решить задачу.

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

пример
getUsersInfo((users) => {
  console.log(users); // [ { name: 'Alex', age: 70 }, { name: 'Elon' } ]
});


Для получения данных вам предоставлены 2 асинхронные функции

getUsersIds - Возвращает массив с идентификаторами пользователей
getUserInfo - Возвращает данные пользователя по заданному идентификатору
пример их работы
getUsersIds((ids) => {
  console.log(ids); // ['id2', 'id6']
});

getUserInfo('id2', (userInfo) => {
  console.log(userInfo); // { name: 'Alex', age: 70 }
});


Вот что получилось сделать
const obj = {
  id1: {
    name: 'Victor',
    age: 32,
  },
  id2: {
    name: 'Alex',
    age: 28,
  },
  id3: {
    name: 'Ivan',
    age: 30,
  },
};

function getUsersIds(cb) {
  setTimeout(() => cb(Object.keys(obj)), 500);
}

function getUserInfo(id, cb) {
  setTimeout(() => cb(obj[id]), 500);
}

function getUsersInfo(onLoad, arr) {
  getUsersIds((ids) => {
    ids.forEach((id) => {
      getUserInfo(id, (user) => {
        // onLoad([...user])
      });
    });
  });
}


данные получаю норм, но не понимаю как их обернуть в массив и этот массив впихнуть в коллбэк, в задание нельзя оборачивать в промис.
  • Вопрос задан
  • 846 просмотров
Решения вопроса 2
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Решение 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);
      }
    });
  });
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы