javascript-解决mongoose数据查询的异步操作
当我在在node环境下操作mongoose时候,发现我通过嵌套形式查询将数据循环放入一个数组时,最后得到数组一直为空,几经百度,依然无果,最后问群里的大神,原来是mongoose以及node异步造成的,百度了解决的办法,以下是我用的一个我认为比较简便的方法。
//原来的代码
varshoppingModel=global.dbHandle.getModel('shopping');
varcartsshop=[];
for(vari=0;i<carts.length;i++){
shoppingModel.findOne({title:carts[i].title},function(err,shops){
if(err){
returnnext(err);
}else{
cartsshop.push(shops);
}
});
}
console.log(cartsshop);//[]
通过引入node自身含有的方法events.
events
Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列。
Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件,一个fs.readStream对象会在文件被打开的时候发出一个事件。所有这些产生事件的对象都是events.EventEmitter的实例。
EventEmitter类
events模块只提供了一个对象:events.EventEmitter。EventEmitter的核心就是事件触发与事件监听器功能的封装。
你可以通过require(“events”);来访问该模块。
以下是一个实例,
//event.js文件
varEventEmitter=require('events').EventEmitter;
varevent=newEventEmitter();
event.on('some_event',function(){
console.log('some_event事件触发');
});
setTimeout(function(){
event.emit('some_event');
},1000);
将我自己的代码进行改进,如下:
varshoppingModel=global.dbHandle.getModel('shopping');
varcartsshop=[];
varobj;
varj=0;
varmyEventEmitter=newevents.EventEmitter();
myEventEmitter.on('next',addResult);
functionaddResult(){
cartsshop.push(obj);
j++;
if(j==carts.length){
console.log(cartsshop);
res.json(cartsshop);
}
}
for(vari=0;i<carts.length;i++){
varii=i;
shoppingModel.findOne({title:carts[ii].title},function(err,shops){
if(err){
returnnext(err);
}else{
obj=shops;
myEventEmitter.emit('next');
}
});
}
当然使用之前必须引入
varevents=require('events');
最后,就成功将数据取出,并返回给客户端啦。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。