首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从2个mongodb集合搜索后的Nodejs单个回调

从2个mongodb集合搜索后的Nodejs单个回调
EN

Stack Overflow用户
提问于 2017-09-14 23:20:53
回答 3查看 133关注 0票数 1

我有两个集合StudProf

我有一个函数,它以id为参数,如果id属于任何一个集合,则返回相应的信息。

  • 第一个函数调用:传递属于id集合的Prof
  • 第二个函数调用:传递属于id集合的Stud

预期结果:首先获得Prof结果,其次是Stud结果。

但是由于nodejs的异步特性,我总是先得到Stud结果,然后才得到Prof结果。

是否通过引入新变量或更改查询集合的方式来完成此任务?

如有任何帮助,将不胜感激。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var check_user_info = function(userid, callback) {
    Stud.findOne({
        '_id': userid
    }, function(err, stud) {
        if (err)
            throw err
        if (stud) {
            callback(stud);
        } else {
            Prof.findOne({
                '_id': userid
            }, function(err, prof) {
                if (err)
                    throw err
                if (prof) {
                    callback(prof);
                } else {
                    callback(false);
                }
            })
        }
    })
    return
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-15 01:20:51

作为前面的答案,您可以使用异步模块来完成此任务。控制节点的非阻塞性有很多功能.在这里,我将建议您使用“并行”方法。由于查询是相互独立的,它将比“瀑布”方法更快。

根据您的问题,代码将如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var async = require('async');
async.parallel(
[
    (cb) => {
        Stud.findOne(
            {
                _id: userid
            },
            cb
        );
    },
    (cb) => {
        Prof.findOne(
            {
                _id: userid
            },
            cb
        );
    }
],
(err, result) => {
    if (err) {
        //handle error
        return;
    }

    //result will be an array where the first element will be the result of first query and
    // second element will be the query result for the second query
    // so according to this .....

    if (result[0]) {
        //id is matched with Stud collection
        //result[0] is the student doc
    } else if (result[1]) {
        //id is matched with Prof collection
        //result[0] is the professor doc
    } else {
        //Neither Stud or Prof
    }
}

);

您可以从asyn文档中了解有关异步方法的信息。

票数 3
EN

Stack Overflow用户

发布于 2017-09-14 23:26:39

您可以使用瀑布异步 mudule方法来解决这个问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async.waterfall([
    function(callback) {
        //your fist query method can go here
        callback(null, query_result1);
    },
    function(first_result1, callback) {
        // your second query method go here
        callback(null, query_result2);
    }
], function (err, result) {
    // final result'
});
票数 1
EN

Stack Overflow用户

发布于 2017-09-14 23:43:24

要回答你的问题,请申请@abdulbarik贴子。

下面是关于您的实际代码的其他内容:

  • 将您的请求分解为函数
  • 当您使用回调时,请使用它们正确返回错误。别扔东西。
  • 您不需要将_id密钥放入引号中

备注:

  • 由于您使用的是现在支持node.js的ES6 (大部分),所以请使用它。阅读更简单,效率更高。

有关回调和功能削减的示例。我让你做剩下的事,就是es6,瀑布处理.您可以查看诺言和异步/等待模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Check if there is a student
function check_student(user_id, callback) {
  Stud.findOne({
    _id: user_id
  }, function (err, stud) {
    if (err) return callback(err, false);

    // stud here can worth false
    return callback(false, stud);
  });
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Check if there is a prof
function check_prof(user_id, callback) {
  Prof.findOne({
    _id: user_id
  }, function (err, prof) {
    if (err) return callback(err, false);

    // prof here can worth false
    return callback(false, prof);
  });
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Get Stud not Prof info
function check_user_info(user_id, callback) {
  // Look if user_id match a stud
  check_student(user_id, function (err, result) {
    // We have an error
    if (err) return callback(err, false);

    // We have a student
    if (result) return callback(false, result);

    // Check if user_id match a prof
    check_prof(user_id, function (err, result) {
      // We have an error
      if (err) return callback(err, false);

      // We have a prof
      if (result) return callback(false, result);

      // No result at all
      return callback(false, false);
    });
  });
}

你怎么称呼它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
check_user_info(user_id, function (err, result) {
  // ...
});

具有承诺的代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // Check if there is a student
        function check_student(user_id) {
          return new Promise((resolve, reject) => {
            Stud.findOne({
              _id: user_id
            }, (err, stud) => {
              if (err) return reject(err);

              // prof here can worth false
              return resolve(stud);
            });
          });
        }

        // Check if there is a prof
        function check_prof(user_id) {
          return new Promise((resolve, reject) => {
            Prof.findOne({
              _id: user_id
            }, (err, prof) => {
              if (err) return reject(err);

              // prof here can worth false
              return resolve(prof);
            });
          });
        }

        // Get Stud not Prof info
        function check_user_info(user_id) {
          return Promise.all([
            check_student(user_id),
            check_prof(user_id),
          ]);
        }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
check_user_info(user_id)
  .then([
    stud,
    prof,
  ] => {
    // Handle result
  })
  .catch((err) => {
    // Handle error
  });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46233922

复制
相关文章
NodeJS使用Redis键的过期回调
当我支付宝创建订单后, 需要定时的把没有完成的订单给关闭, 这时候需要有个定时任务, 或者队列来完成, 不想安装兔子, 那就用本来就安装了的Redis来简单实现
治电小白菜
2020/08/25
2.4K0
NodeJS使用Redis键的过期回调
Android里用AsyncTask后的接口回调
AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程。
Vaccae
2019/07/25
1.3K0
回调
回调简单而言:在一个类(A)的方法(a)中调用另一个类(B)的方法(b),当方法(b)执行完之后就调用类(A)中的方法(c),这就是回调的过程,是不是很简单?简单分析可以知道一个类(A)持有另一个类(B)的引用,方法(c)就叫做回调函数,画成UML图就如下所示:
晚上没宵夜
2020/03/10
2.6K0
回调函数的工作机制 回调函数的用途
在一般人的眼中,对回调函数并不是十分的了解。实际上,在现在的互联网技术上这种函数有着十分重要的地位。这种函数不仅仅可以使得编程的效率大大提升,还是实现一些特殊功能的必须组成部分。那么什么是回调函数?这样的函数究竟有什么作用?下面就来为大家介绍一下。
用户8739405
2021/07/09
6.8K0
Angularjs的回调
$q.reject() 方法是在你捕捉异常之后,又要把这个异常在回调链中传下去时使用:
星回
2018/08/02
1.7K0
Ajax 的回调
页面上有两个button,以上js代码为button添加click事件。会输出什么样的结果呢?
用户7293182
2022/01/17
4.4K0
​29 - 回调函数和回调地狱
原文地址:https://dev.to/bhagatparwinder/callback-functions-callback-hell-79n
前端黑板报
2022/12/01
4.6K0
什么是回调地狱?如何解决回调地狱问题_地狱回调
这个问题呢,需要从Node.js的API说起,这里就会有人问了?博主你不是说回调地狱的问题吗,怎么说到API了,别急,看博主一步一步的解释给你听:
全栈程序员站长
2022/11/15
3.2K0
怎么卸载nodejs(nodejs mongodb)
Node.js是一个JavaScript运行环境,可以使JavaScript这类脚本语言编写出来的代码运行速度获得极大提升,那么安装后该如何卸载呢?
全栈程序员站长
2022/08/02
6.9K0
七、回调
修改PspNotifyEnableMask为00000009,创建和退出进程时就不会触发回调
zhang_derek
2022/09/29
1.6K0
SpringMVC+MongoDB+Maven整合(微信回调Oauth授权)
个人小程序。里面是基于百度大脑 腾讯优图做的人脸检测。是关于人工智能的哦。 2017年第一篇自己在工作中的总结文档。土豪可以打赏哦。 https://git.oschina.net/xshuai/sm
小帅丶
2018/03/12
3.6K0
SpringMVC+MongoDB+Maven整合(微信回调Oauth授权)
MongoDB开发系列:从数据集合的设计开始
MongoDb中集合概念就是关系型数据库中的表,本文讨论的内容主要集中在MongoDb数据库库设计集合时关键原则和常见的设计误区。
needrunning
2019/07/04
1.9K0
MongoDB开发系列:从数据集合的设计开始
关于回调
爱学习的前端歌谣
2023/10/18
1810
关于回调
回调函数
  有点类似模板的功能,可以使用函数指针作为参数,当调用函数时,使用void *进行传递参数,细致比较时,再用int *之类的进行强制转换。回调函数,其实就是在参数中定义函数,调用时,回到主函数去调用这个函数。仔细用法如下: 首先定义查找函数 Node * search_list(Node *node, void const *value, int (*compare)(void const *,void const *)){ while(node!=NULL){ if(compar
用户1154259
2018/01/17
3.3K0
回调函数
回调函数
什么是回调函数,上面的问题说的是不是很空洞,不是太形象,下面是知乎上的一位网友给的答案:
LiosWong
2018/10/29
3.8K0
回调地狱
一个函数,作为参数的形式传给另一个函数调用,那么这个这个函数就叫做回调函数。 当然回调函数很常见,如下
用户4793865
2023/01/12
1.4K0
回调地狱
前言 从前一文中你真的了解回调?我们已知道回调函数是必须得依赖另一个函数执行调用,它是异步执行的,也就是需要时间等待,典型的例子就是Ajax应用,比如http请求,在不刷新浏览器的情况下,当你执行DO
itclanCoder
2020/10/28
2.3K0
回调地狱
回调函数
原文链接:https://note.noxussj.top/?source=cloudtencent 什么是回调函数? 简单的来说,一个函数作为另外一个函数的参数,可以称为回调函数。这个理解其实不完全
菜园前端
2023/05/20
1.7K0
js函数的回调
以上只能回调没有参数的(除法你事先知道回调的函数的参数),如果函数有未知的函数,就不能如此简单的调用了。
全栈程序员站长
2022/08/25
4.5K0
RunTime的回调钩子
项目运行结束得时候可能需要对一些现有得信息进行保存。比如说我们在java进程退出得时候要保存一些数据,下次启动得时候要用到这些数据得情况。Java在1.3得时候就支持了这种特性。这种特性得实现就在类RunTime中。以下四种方式均可出发runtime得回调。
写一点笔记
2022/08/11
4770
RunTime的回调钩子

相似问题

NodeJS MongoDB回调地狱

22

Nodejs MongoDb异步回调

38

Nodejs,MongoDB异步回调问题

11

.connect()回调的作用域(nodejs,mongodb)

10

nodejs中用于循环的mongodb回调

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文