JS回调函数是异步调用 记录踩到的坑

今天正好公司停电,放假一天,准备听课封装一下用nodejs操作 MongoDB数据库的方法来着,

然后我就掉坑里了

记录一下吧

首先说一下环境,我用的是nodejs 操作MongoDB数据库用的包是mongodb

第一步,按部就班的写一下,找到数据库和集合,准备操作;

// 加载mongodb包
var mongodb = require("mongodb");

// 连接客户端
var mongoClient = mongodb.MongoClient;

// 准备地址
var url = "mongodb://127.0.0.1:27017";

// 连接客户端
mongoClient.connect(url, function (err, client) {

    // 检测错误
    if (err) {
        console.log("** 数据库连接失败 **");
    } else {
        console.log("** 数据库连接成功 **");

        // 操作
        var db = client.db("db1811");               // 数据库
        var collection = db.collection("person");   // 集合

        // 增删改查操作

        client.close();  // 关闭连接
    }
})

二、我将查询数据的方法,抽取出来了

方法说明:

参数1 是集合对象,也就是要查询的集合;

参数2 是查询的条件对象;

参数3 是连接到的客户端对象

我想的是,在调用我这个方法的时候,生成一个对象,然后不管查询的结果如何,都在我这个对象中有所体现

比如说,我查询失败,对象中就会存储失败的状态码和失败信息,成功的话就会存储成功的状态码和查询到的数据

如:

失败 - ret = {state:0 , content:" err信息 "}

成功 - 有数据 - ret = {state:1 , content : [{.. , ..}] }

        - 无数据 - ret = {state:1 , content : "** 暂无数据 **"}

然后在外边就可以根据返回的数据进行操作了;

/**
 * DataFind() 查询数据
 * @param {*} collection    集合对象
 * @param {*} data          查询条件
 * @param {*} client        客户端对象
 * 返回值是一个对象 {state:状态码 0-失败 1-成功,content:"错误原因/查到的数据"} 
 */
var DataFind = function (collection, data, client) {
    var ret = {};
    collection.find(data).toArray(function (err, result) {
        if (err) {
            ret.statea = 0;
            ret.content = err;
        } else {
            if (result.length > 0) {
                ret.statea = 1;
                ret.content = result;
            } else {
                ret.statea = 1;
                ret.content = "** 暂无数据 **";
            }
        }
        client.close();
    });
    return ret;
}

使用如下:

打印出的结果如下:

没拿到数据;

我的分析如下:

我封装的方法里面用到的这个查询方法是异步执行的,也就是当我执行这个封装方法的时候,执行就直接

var ret = {};

return ret;

中间的代码,暂时没执行,因为同步代码和异步代码在一起的时候,先执行同步代码;

所以返回出来的是个空的对象,里边查询出来的数据是 undefined

 

然后,我这个问题现在还没解决,求大神解救;

跪谢 ! ! !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值