欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

javascript-解决mongoose数据查询的异步操作

程序员文章站 2023-09-29 10:48:33
当我在在node环境下操作mongoose时候,发现我通过嵌套形式查询将数据循环放入一个数组时,最后得到数组一直为空,几经百度,依然无果,最后问群里的大神,原来是mongo...

当我在在node环境下操作mongoose时候,发现我通过嵌套形式查询将数据循环放入一个数组时,最后得到数组一直为空,几经百度,依然无果,最后问群里的大神,原来是mongoose以及node异步造成的,百度了解决的办法,以下是我用的一个我认为比较简便的方法。

//原来的代码
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 操作在完成时都会发送一个事件到事件队列。

node.js里面的许多对象都会分发事件:一个net.server对象会在每次有新连接时分发一个事件, 一个fs.readstream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.eventemitter 的实例。

eventemitter 类

events 模块只提供了一个对象: events.eventemitter。eventemitter 的核心就是事件触发与事件监听器功能的封装。
你可以通过require(“events”);来访问该模块。

以下是一个实例,

//event.js 文件
var eventemitter = require('events').eventemitter; 
var event = new eventemitter(); 
event.on('some_event', function() { 
  console.log('some_event 事件触发'); 
}); 
settimeout(function() { 
  event.emit('some_event'); 
}, 1000); 

将我自己的代码进行改进,如下:

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');
  }
 });
}

当然使用之前必须引入

var events = require('events');

最后,就成功将数据取出,并返回给客户端啦。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。