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 简单高效判断数据类型 系列函数 By shawl.qiu
Mar 06 Javascript
javascript显示选择目录对话框的代码
Nov 10 Javascript
javascript 框架小结 个人工作经验
Jun 13 Javascript
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
May 18 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
Jun 11 Javascript
JQuery 图片滚动轮播示例代码
Mar 24 Javascript
javascript和jquery实现用户登录验证
May 04 Javascript
vue初尝试--项目结构(推荐)
Jan 30 Javascript
深入理解JS的事件绑定、事件流模型
May 13 Javascript
微信小程序实现时间预约功能
Nov 27 Javascript
JavaScript面试技巧之数组的一些不low操作
Mar 22 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
Aug 12 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
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
PHP统计目录大小的自定义函数分享
2014/11/18 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
深入讲解Python编程中的字符串
2015/10/14 Python
Python实现求解一元二次方程的方法示例
2018/06/20 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
django做form表单的数据验证过程详解
2019/07/26 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
python实现批量命名照片
2020/06/18 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
优秀老员工获奖感言
2014/02/15 职场文书
授权收款委托书
2014/09/23 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
使用Ajax实现进度条的绘制
2022/04/07 Javascript
速龙x4-860k处理器相当于i几
2022/04/20 数码科技
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技