我不确定我是否遇到麻烦,因为我不了解JS或mongodb / mongoose。
这是我当前的代码:
/**
* Fins all (biological) siblings of this person.
* @returns {Array} Returns all the siblings as a list. If no siblings were found, returns an empty list.
*/
personSchema.methods.getSiblings = function () {
const sibs = new Set();
this.model('Person').findById(this.mother, function(err, mom) {
mom.children.forEach((child) => { sibs.add(child); });
});
this.model('Person').findById(this.father, function(err, pa) {
pa.children.forEach((child) => { sibs.add(child); });
});
console.log(sibs);
return sibs;
}
我希望此功能可以从此人的父母中获取所有孩子,并以列表的形式返回其ID(有效地返回此人的生物学同胞)。现在,此函数将返回的唯一内容是一个空集。我想我理解原因,这是因为该函数在返回之前不等待查询完成。但是我该如何实现呢?我知道我可以使用Promise,但是即使母亲查询返回错误,我也想添加父亲的孩子。
感谢您的帮助!
PS:有没有更好的方法将列表的所有元素添加到集合中?
编辑:我找到了一个解决方案,但这可能不是最佳选择:
/**
* Finds all biological siblings of this person.
* @param callback(sibs) the function to call when finished. Sets the sibs parameter of the callback function to a list
* of sibling IDs or an empty list if no siblings were found.
*/
personSchema.methods.getSiblings = function (callback) {
const self = this;
const mId = this.mother;
const pId = this.father;
const sibs = [];
self.model('Person').findById(mId, "children", function (err, res) {
if (!err)
sibs.push(res.children);
self.model('Person').findById(pId, "children", function (err, res) {
if (!err)
sibs.push(res.children);
callback(_.uniqWith(sibs, _.isEqual));
})
});
}