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 相关文章推荐
一个js的tab切换效果代码[代码分离]
Apr 11 Javascript
在次封装easyui-Dialog插件实现代码
Nov 14 Javascript
js使用for循环查询数组中是否存在某个值
Aug 12 Javascript
jQuery中contents()方法用法实例
Jan 08 Javascript
js获取客户端操作系统类型的方法【测试可用】
May 27 Javascript
js窗口震动小程序分享
Nov 28 Javascript
微信小程序 自定义消息提示框
Aug 06 Javascript
webpack+vue中使用别名路径引用静态图片地址
Nov 20 Javascript
在vue项目中引入highcharts图表的方法
Jan 21 Javascript
详解vue几种主动刷新的方法总结
Feb 19 Javascript
教你完全理解ReentrantLock重入锁
Jun 03 Javascript
JS桶排序的简单理解与实现方法示例
Nov 25 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 特殊字符处理函数
2008/09/05 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
php实现读取手机客户端浏览器的类
2015/01/09 PHP
php显示时间常用方法小结
2015/06/05 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
2010/08/13 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python访问sqlserver示例
2014/02/10 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
python爬虫神器Pyppeteer入门及使用
2019/07/13 Python
如何理解python面向对象编程
2020/06/01 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
《雪儿》教学反思
2014/04/17 职场文书
经销商年会策划方案
2014/05/29 职场文书
校园元旦活动总结
2014/07/09 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
公司员工体检通知
2015/04/21 职场文书