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 模拟点击广告
Jan 02 Javascript
文件编码导致jquery失效的解决方法
Jun 26 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
Nov 25 Javascript
浅谈JavaScript超时调用和间歇调用
Aug 30 Javascript
jQuery打字效果实现方法(附demo源码下载)
Dec 18 Javascript
jQuery 3.0 的 setter和getter 模式详解
Jul 11 Javascript
详解jQuery lazyload 懒加载
Dec 19 Javascript
setTimeout时间设置为0详细解析
Mar 13 Javascript
vue路由教程之静态路由
Sep 03 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
Dec 04 Javascript
vue2.x数组劫持原理的实现
Apr 19 Javascript
原生js实现下拉框选择组件
Jan 20 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静态变量当缓存的方法
2013/11/13 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
python简单实现刷新智联简历
2016/03/30 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
python动态进度条的实现代码
2019/07/03 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
处理textarea中的换行和空格
2019/12/12 HTML / CSS
毕业生就业自荐书
2013/12/15 职场文书
小学英语教学反思案例
2014/02/04 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
家属慰问信
2015/02/14 职场文书
2015年医院工作总结范文
2015/04/09 职场文书
小学德育工作总结2015
2015/05/12 职场文书
少年雷锋观后感
2015/06/10 职场文书
关于nginx 实现jira反向代理的问题
2021/09/25 Servers
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android