Заполните массив, который находится вне области функции обратного вызова

1

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

function getItemObjects(items, callback) {
  let returnItems = [];
  items.forEach((i) => {
    Item.getItemById(i, (err, item) => {
      if (err) {
        console.log(err);
        return;
      } else {
        returnItems.push(item);
      }
    });
  });
  callback(returnItems);
}

Item.getItemById() - это функция в моей модели Item, которая получает объект из базы данных mongo. Как я могу заполнить массив, который выходит за пределы этой функции обратного вызова?

Как только, когда я получаю значение обратного вызова из функции getItemObjects(), это значение равно []. Однако, если я зарегистрирую его значение в цикле for, он будет правильно заполнен.

  • 1
    Что вы получаете в returnItems непосредственно перед callback(returnItems); выполняется?
  • 0
    Он просто возвращает пустой массив. Каждый раз, когда я ссылаюсь на него вне области функции обратного вызова Item.getItemById (), он пуст, как будто он сбрасывается, когда я покидаю эту функцию.
Показать ещё 1 комментарий
Теги:
callback

1 ответ

1
Лучший ответ

Вы можете использовать обещания для извлечения значений из обратного вызова базы данных.

попробуй это:

function getItemObjects(items, callback) {
  const itemPromises = items.map((itemId) => {
    return new Promise((resolve, reject) => {
      Item.getItemById(itemId, (err, item) => {
        if (err) {
          reject(err);
        }
        resolve(item);
      });
    });
  });

  Promise.all(itemPromises)
    .then(results => callback(results))
    .catch(error => callback(error));

}

Обратите внимание здесь, если какой-либо из элементов приводит к ошибке, тогда полное обещание (из Promise.all) завершится неудачно, и блок catch будет выполнен.

Вы можете найти больше на Promise.all и Promise.catch

  • 0
    Спасибо, отлично работает. Мне пришлось добавить элементы в качестве аргумента для обратного вызова в .then, но после этого он работает правильно.
  • 0
    Спасибо за указание. Я обновил код с вашим комментарием.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню