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 GUID生成器实现代码
Oct 31 Javascript
利用JS判断用户是否上网(连接网络)
Dec 23 Javascript
超级简单实现JavaScript MVC 样式框架
Mar 24 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
Sep 22 Javascript
JS二叉树的简单实现方法示例
Apr 05 Javascript
浅谈react.js 之 批量添加与删除功能
Apr 17 Javascript
JS数组交集、并集、差集的示例代码
Aug 23 Javascript
vue项目前端埋点的实现
Mar 06 Javascript
小程序测试后台服务的方法(ngrok)
Mar 08 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
Jul 19 Javascript
改变layer confirm弹窗按钮的颜色方法
Sep 12 Javascript
vue2.x 对象劫持的原理实现
Apr 19 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做了一个领取优惠券活动的示例代码
2019/07/05 PHP
YUI的Tab切换实现代码
2010/04/11 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
JavaScript解析json格式数据简单示例
2014/12/09 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
python画折线图的程序
2018/07/26 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
机械设计制造专业个人求职信
2013/09/25 职场文书
本科生个人求职自荐信
2013/09/26 职场文书
《得道多助,失道寡助》教学反思
2014/04/19 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
利用python进行数据加载
2021/06/20 Python