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


Posted in Javascript onDecember 22, 2016

当我在在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');

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

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

Javascript 相关文章推荐
JavaScript高级程序设计 客户端存储学习笔记
Sep 10 Javascript
jQuery使用fadein方法实现渐出效果实例
Mar 27 Javascript
javascript制作的简单注册模块表单验证
Apr 13 Javascript
JS 获取HTML标签内的子节点的方法
Sep 21 Javascript
简单实现AngularJS轮播图效果
Apr 10 Javascript
ECMAScript6--解构
Mar 30 Javascript
ES6新特性三: Generator(生成器)函数详解
Apr 21 Javascript
js canvas实现擦除效果示例代码
Apr 26 Javascript
原生JavaScript实现的简单放大镜效果示例
Feb 07 Javascript
如何在微信小程序中实现Mixins方案
Jun 20 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
Sep 14 Javascript
JavaScript React如何修改默认端口号方法详解
Jul 28 Javascript
Bootstrap popover用法详解
Dec 22 #Javascript
深入学习jQuery中的data()
Dec 22 #Javascript
读Javascript高性能编程重点笔记
Dec 21 #Javascript
解决拦截器对ajax请求的拦截实例详解
Dec 21 #Javascript
原生的强大DOM选择器querySelector介绍
Dec 21 #Javascript
懒加载实现的分页&amp;&amp;网站footer自适应
Dec 21 #Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
Dec 21 #Javascript
You might like
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
用JS控制回车事件的代码
2011/02/20 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
使用python绘制常用的图表
2016/08/27 Python
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
python实现统计代码行数的小工具
2019/09/19 Python
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
后勤人员自我鉴定
2013/10/20 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
2014年中职班主任工作总结
2014/12/16 职场文书
教师工作表现评语
2014/12/31 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
食品卫生管理制度
2015/08/06 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers