当我在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'); |
最后,就成功将数据取出,并返回给客户端啦。