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

 

然後,我這個問題現在還沒解決,求大神解救;

跪謝 ! ! !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章