Учитывая массив строк, которые представляют идентификаторы элементов, я хочу выполнить итерацию по строкам, вытащить объект объекта из моей базы данных и добавить объект 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, он будет правильно заполнен.
Вы можете использовать обещания для извлечения значений из обратного вызова базы данных.
попробуй это:
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
returnItems
непосредственно передcallback(returnItems);
выполняется?