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 闭包在封装函数时的简单分析
Nov 28 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
Feb 27 Javascript
使用js判断控件是否获得焦点
Jan 03 Javascript
JS在可编辑的div中的光标位置插入内容的方法
Nov 20 Javascript
jquery验证手机号是否正确实例讲解
Nov 17 Javascript
Jq通过td获取同行其它列td的方法
Oct 05 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
Sep 01 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
Mar 01 Javascript
vuex页面刷新后数据丢失的方法
Jan 17 Javascript
微信小程序导航栏跟随滑动效果的实现代码
May 14 Javascript
node.js中 redis 的安装和基本操作示例
Feb 10 Javascript
Ajax实现三级联动效果
Oct 05 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 递归效率分析
2009/11/24 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
PHP return语句的另一个作用
2014/07/30 PHP
php post换行的方法
2020/02/03 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
2017/01/26 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
python方向键控制上下左右代码
2018/01/20 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
请用用Java代码写一个堆栈
2012/01/26 面试题
EJB的角色和三个对象
2015/12/31 面试题
软件工程师岗位职责
2013/11/16 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server