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 相关文章推荐
jquery $.ajax入门应用一
Nov 19 Javascript
IE8 下的Js错误HTML Parsing Error...
Aug 14 Javascript
Javascript document.referrer判断访客来源网址
May 15 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
Sep 28 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
May 17 Javascript
再探JavaScript作用域
Sep 24 Javascript
谈谈JavaScript异步函数发展历程
Sep 29 Javascript
AngularJS 依赖注入详解和简单实例
Jul 28 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
Mar 11 Javascript
JS中利用FileReader实现上传图片前本地预览功能
Mar 02 Javascript
微信小程序自定义tab实现多层tab嵌套功能
Jun 15 Javascript
详解react native页面间传递数据的几种方式
Nov 07 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
资料注册后发信小技巧
2006/10/09 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
Python中encode()方法的使用简介
2015/05/18 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
python实现ip代理池功能示例
2019/07/05 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
自动化专业毕业生自荐信
2013/11/01 职场文书
工业设计专业个人求职信范文
2013/12/28 职场文书
六年级学生评语
2014/04/22 职场文书
技能比武方案
2014/05/21 职场文书
党员目标管理责任书
2014/07/25 职场文书
最感人的道歉情书
2015/05/12 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL