javascript-解决mongoose数据查询的异步操作

 更新时间:2016年12月22日 08:37:59   作者:千里之外  
这篇文章主要介绍了javascript-解决mongoose数据查询的异步操作,具有一定的参考价值,有兴趣的可以了解一下。

当我在在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中的事件与异常捕获详析

    这篇文章主要给大家介绍了关于JavaScript中事件与异常捕获的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • JS倒计时两种实现方式代码实例

    JS倒计时两种实现方式代码实例

    这篇文章主要介绍了JS倒计时两种实现方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 在table中插入多行,能使用与insertAdjacentHTML相似的功能吗?

    在table中插入多行,能使用与insertAdjacentHTML相似的功能吗?

    在table中插入多行,能使用与insertAdjacentHTML相似的功能吗?...
    2006-12-12
  • 通过正则格式化url查询字符串实现代码

    通过正则格式化url查询字符串实现代码

    看到项目里通过js数组split方法格式化查询字符串的,突发奇想为什么不能用正则呢,性能如何?感兴趣的朋友可以研究下哦
    2012-12-12
  • JavaScript弹出窗口方法汇总

    JavaScript弹出窗口方法汇总

    这篇文章主要介绍了JavaScript弹出窗口方法,非常实用的功能,需要的朋友可以参考下
    2014-08-08
  • Javascript oop设计模式 面向对象编程简单实例介绍

    Javascript oop设计模式 面向对象编程简单实例介绍

    这篇文章主要介绍了Javascript oop设计模式 面向对象编程简单实例介绍的相关资料,这里附有实例代码帮助大家学习理解,需要的朋友可以参考下
    2016-12-12
  • 在layer弹层layer.prompt中,修改placeholder的实现方法

    在layer弹层layer.prompt中,修改placeholder的实现方法

    今天小编大家分享一篇在layer弹层layer.prompt中,修改placeholder的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • javascript Echart可视化学习

    javascript Echart可视化学习

    这篇文章主要为大家介绍了Echart可视化学习的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 微信小程序使用第三方库Immutable.js实例详解

    微信小程序使用第三方库Immutable.js实例详解

    Immutable 是 Facebook 开发的不可变数据集合。不可变数据一旦创建就不能被修改,是的应用开发更简单,允许使用函数式编程技术,比如惰性评估。微信小程序无法直接使用Immutable.js,下面就来说说微信小程序如何使用第三方库Immutable.js。
    2016-09-09
  • Nginx上传文件全部缓存解决方案

    Nginx上传文件全部缓存解决方案

    Nginx默认会对上传的文件先在本地进行缓存,再转发到应用服务器。请问怎么禁止掉这个缓存,让Nginx只转发而不缓存文件?本文给大家详细介绍Nginx上传文件全部缓存解决方案,有需要的朋友来参考下
    2015-08-08

最新评论