javascript如何解决mongoose数据查询异步操作的教程

当我在node环境下操作mongoose时候,发现我通过嵌套形式查询将数据循环放入一个数组时,最后得到数组一直为空,几经百度,依然无果,最后问群里的大神,原来是mongoose以及node异步造成的,百度了解决的办法,以下是我用的一个我认为比较简便的方法。


//原来的代码

varshoppingModel = global.dbHandle.getModel('shopping');

varcartsshop = [];

for(vari = 0;i<carts.length;i++){

shoppingModel.findOne({title:carts[i].title},function(err,shops) {

  if(err){

    returnnext(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 文件

varEventEmitter = require('events').EventEmitter;

varevent =newEventEmitter();

event.on('some_event',function() {

  console.log('some_event 事件触发');

});

setTimeout(function() {

  event.emit('some_event');

}, 1000);

将我自己的代码进行改进,如下:


varshoppingModel = global.dbHandle.getModel('shopping');

varcartsshop = [];

varobj ;

varj = 0;

varmyEventEmitter =newevents.EventEmitter();

myEventEmitter.on('next',addResult);

functionaddResult() {

  cartsshop.push(obj);

  j++;

  if(j==carts.length){

    console.log(cartsshop);

    res.json(cartsshop);

  }

}

for(vari = 0;i<carts.length;i++){

  varii = i;

 shoppingModel.findOne({title:carts[ii].title},function(err,shops) {

  if(err){

    returnnext(err);

  }else{

    obj = shops;

    myEventEmitter.emit('next');

  }

 });

}

当然使用之前必须引入

varevents = require('events');

最后,就成功将数据取出,并返回给客户端啦。

时间: 2024-10-02 23:17:22

javascript如何解决mongoose数据查询异步操作的教程的相关文章

Javascript中如何实现关联数据查询

本文介绍如何利用Javascript从DBpedia中获取我们想要的数据. DBpedia的作用:对Wikipedia的数据变成Linked Data形式,使得机器也能读懂并自由获得这些数据. SPARQL Trying to use the Semantic Web without SPARQL is like trying to use a relational database without SQL. -- Tim Berners-Lee SPARQL是Semantic Web(语义网)

C#.net 12月11日前帮我解决送100分 用户注册 远程图像管理 远程数据查询 谁能帮我解决

问题描述 代码都写了,没有提示代码错误,却实现不了功能.下面是我写的代码和要求谁能在11号前帮我解决我把所有分都送给他1.用户注册客户端程序采用B/S结构,程序要求:l客户端程序是一个login.htm的注册网页,包含名称为user的用户文本框与名称是pass的密码框,在输入用户名光标离开user框时,即刻可以显示该用户名称是否可以使用.并且在用户名称与密码都不为空时才可以提交.l服务器端实现用户的注册,把新用户写入数据库,并实现用户名称是否可以使用的查询.<html><head>

利用JQuery方便实现基于Ajax的数据查询、排序和分页功能

ajax|分页|排序|数据        之前很少会用javascript去实现页功能主要怕麻烦,但了解JQuery后这种想法发生了变化:有了这样的脚本组件就可以在编写脚本时方便和HTML隔离出来,这样编写高重用性的脚本就更方便.下面就是介绍在学习JQuery过程中编写的基于Ajax的数据查询.排序和分页功能的复用脚本,只要遵循脚本的某些规则描述HTML把脚本文件引入就可以方便实现以上描述的功能.        先看下实现功能的脚代码: /**应用脚本规则:           引用脚本: JQ

运用 ADO.NET 对象优化数据查询代码

ado|对象|数据|优化    毫无疑问,ADO.NET 向人们提供了一种功能强大.仿真数据库的对象模型,它可以将数据记录保存到内存中.尤其是ADO.net 的 DataSet 类,它不但在功能上相当于数据库表的集中存储器(central repository),而且支持表间的各种约束和逻辑关系.进一步说来,DataSet 对象其实是一种离线数据容器.     乍一看,只要把 DataSet 类的所有特性联合起来,就能消除 SQL 查询命令中的复杂子句,比如那些泛滥成灾且层层嵌套的 INNER

用ADO的COMMAND对象实现对WEB数据库动态数据查询的方法

用ADO的COMMAND对象实现对WEB数据库动态数据查询的方法★ 林碧英众所周知,由于ASP技术的出现,使得Intranet的应用更加广泛深入.相当多的企业都建立了企业内部综合查询系统,如何快速.准确地查询企业内部信息是编写基于WEB技术应用程序必须要解决的主要问题.ASP提供了用ADO内置的3个主要对象Recordset.Connection和Command对WEB数据库进行操作.其中Connection的主要功能是建立与WEB数据库的链接:Command的主要功能是向WEB数据库传送数据查

vfp中的数据查询

Visual FoxPro 语言体系包括三个部分:一是传统的Xbase 语言体系,二是结构化查询语言(SQL),三是面向对象化(OOP)程序设计语言.笔者认为,Visual FoxPro 这三部分语言都具有数据查询的功能.可能对于Xbase语言和SQL语言具有数据查询功能大家是没有异议的,但Visual FoxPro中的OOP语言应不会有数据查询功能,因为一般认为在Visual FoxPro中数据处理是非面向对象的,就此可以得出Visual FoxPro中的OOP语言应不具备数据查询功能.其实则

SQL Server利用HashKey计算列解决宽字段查询的性能问题

SQL Server利用HashKey计算列解决宽字段查询的性能问题 主人翁        本文主人翁:MSSQL菜鸟和MSSQL老鸟. 问题提出        某年某月某日,某MSSQL菜鸟满脸愁容的跑到老鸟跟前,心灰意懒的对老鸟说"我最近遇到一个问题,很大的问题,对,非常大的问题".老鸟不急不慢的推了推2000度超级近视眼镜框,慢吞吞的说:"说来听听".        "我有一个100万数据量的表,有一个宽度为7500字段,不幸的是现在我需要根据这个字

mysql-利用MySQL数据库如何解决大数据量存储问题?

问题描述 利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开关量历史数据表,这两张表字段设计的很简单(OrderNo,Value,DataTime).基本上每张表每天可以增加几千万条数据,我想问如何存储数据才能不影响检索速度呢?需不需要换oracle数据库呢?因为我是数据库方面的新手,希望可以说的详细一点,万分感谢!!! 解决方案 查询业务是怎么样

phalapi-进阶篇6(解决大量数据存储数据库分表分库拓展)

phalapi-进阶篇6(解决大量数据存储数据库分表分库拓展) 前言 时隔半个月随着PHP7的推出为PHP打了一瓶兴奋剂,在性能提升了一倍的情况下我们会逐渐发现,瓶颈会集中在数据库操作,那我们的内容就接着数据库读写分离,来聊聊分表分库应该怎么玩,应为PhalApi的分表分库并不是非常方便,笔者在这里提供了一个分表分库数据库集群的拓展,详细文档请见博客基于PhalApi的DB集群拓展 V0.1bate 大家可以自行在开源中国扩展Git地址中找到Cluster进行下载使用. 先在这里感谢phalap