看到这样一句话 node中map()有一个特性:当其函数里面里面有回调它就变成异步;
我现在有一个这样的一个函数,遍历数组从mongodb中找出想要的数据。
function save(arr) {
let newArr = [];
arr.map((item) => {
Model.findOne({_id: item.id}, (err, data) => {
newArr.push(data)
// do something
})
});
console.log(newArr)
}
我不是知道如何将这个函数改为同步的,我想要得到一个有数据的newArr,而不是一个空数组,
请指教!
一日吸猫,终身吸猫。一旦异步,就不要试图在其中混入同步的逻辑,这会极大地损失性能和造成各种问题。相反,你应该把所有同步的逻辑想办法改为异步的,这是使用异步编程的最基本要求,也是对同步编程思维方式最大的一个挑战。
异步的思维方式要求你找到合适的时间点触发合适的事件。比如你的场景可以这样理解:
arr
中的每个元素都可以找到一个对应的数据库文档_id
查询对应的记录(这就是map
里面做的事情)push
到newArr
之后再执行后续操作4的要求可以抽象为:同时执行n个操作,如何在n个操作都完成后再执行下面的操作。这是异步编程里面经常遇到的问题。因为经常遇到,所以肯定也已经有解决方案了:
这两个类库请挑一个仔细学习,都可以解决你的问题。因为这是使用异步编程必须跨过的一关,必须要你自己理解,我在这里不给具体的答案,请先尝试自己解决。
就事论事来说你的问题,无论是从效率还是便捷性上来说,其实你都做得太复杂了(当然不排除你是为了实验目的)。从解决问题的角度来说,建议直接使用
$in
: