當(dāng)我在在node環(huán)境下操作mongoose時候,發(fā)現(xiàn)我通過嵌套形式查詢將數(shù)據(jù)循環(huán)放入一個數(shù)組時,最后得到數(shù)組一直為空,幾經(jīng)百度,依然無果,最后問群里的大神,原來是mongoose以及node異步造成的,百度了解決的辦法,以下是我用的一個我認(rèn)為比較簡便的方法。
//原來的代碼var shoppingModel = global.dbHandle.getModel('shopping');var cartsshop = [];for(var i = 0;i<carts.length;i++){shoppingModel.findOne({title:carts[i].title},function (err,shops) { if(err){ return next(err); }else{ cartsshop.push(shops); } });}console.log(cartsshop);//[]通過引入node自身含有的方法events.
events
Node.js 所有的異步 I/O 操作在完成時都會發(fā)送一個事件到事件隊列。
Node.js里面的許多對象都會分發(fā)事件:一個net.Server對象會在每次有新連接時分發(fā)一個事件, 一個fs.readStream對象會在文件被打開的時候發(fā)出一個事件。 所有這些產(chǎn)生事件的對象都是 events.EventEmitter 的實例。
EventEmitter 類
events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就是事件觸發(fā)與事件監(jiān)聽器功能的封裝。
你可以通過require(“events”);來訪問該模塊。
以下是一個實例,
//event.js 文件var EventEmitter = require('events').EventEmitter; var event = new EventEmitter(); event.on('some_event', function() { console.log('some_event 事件觸發(fā)'); }); setTimeout(function() { event.emit('some_event'); }, 1000); 將我自己的代碼進(jìn)行改進(jìn),如下:
var shoppingModel = global.dbHandle.getModel('shopping');var cartsshop = [];var obj ;var j = 0;var myEventEmitter = new events.EventEmitter();myEventEmitter.on('next',addResult);function addResult() { cartsshop.push(obj); j++; if(j==carts.length){ console.log(cartsshop); res.json(cartsshop); }}for(var i = 0;i<carts.length;i++){ var ii = i; shoppingModel.findOne({title:carts[ii].title},function (err,shops) { if(err){ return next(err); }else{ obj = shops; myEventEmitter.emit('next'); } });}當(dāng)然使用之前必須引入
var events = require('events');最后,就成功將數(shù)據(jù)取出,并返回給客戶端啦。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點
疑難解答