给定一个表示项目ID的字符串数组,我想遍历字符串,从我的数据库中提取项目对象,并将项目对象添加到数组中,该数组位于数据库回调范围之外。
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循环中记录它的值,则会正确填充它。
答案 0 :(得分:1)
您可以使用promises从数据库回调中提取值。
试试这个:
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(来自Promise.all)将失败并且catch块将被执行。
上找到更多信息