簡體   English   中英

異步等待不等待解決

[英]async await not waiting for resolve

所以,我是我的 nodeJS 項目,我有這部分代碼,不是在等待 await 調用

控制器.js

exports.getList = async function(request, response) {
try {
    const result = await useCase.getList()
    if (result == undefined) {
        utils.unavailable(response)
    }
    else if (result == null || result.length == 0) {
        utils.respond(response, 404, errCodes.NOT_FOUND)
    }
    else utils.respond(response, 200, result)
}
catch(e) {
    utils.unavailable(response)
}}

這是控制器上的函數,它調用來自用例的響應

用例.js

exports.getList = async function() {
return await new Promise(function(resolve) {
    resolve(repository.getList())
})

這也調用存儲庫

資源庫.js

exports.getList = async function() {
MongoClient.connect(Constants.DB_URL, function(err, db) {
    if (err) {
        console.log(err)
        return undefined
    }  
    const dbo = db.db(Constants.DB_NAME)
    dbo.collection(Constants.DB_FEATURE1_COLLECTION).find({}).toArray(function(err, result) {
        if (err) {
            console.log(err)
            return undefined
        }
        db.close()
        return result
    })
});

因此,發生的情況是,在控制器上,結果始終未定義,因為結果尚未初始化,而實際上它應該等待 UseCase 上 Promise 的響應。 那么我做錯了什么?

getList函數沒有 return 語句,因為它是async所以它返回一個總是用undefined解析的 Promise。 我對MongoClient不是很熟悉,但文檔說如果沒有指定回調,它會返回一個承諾。 所以你可以改變你的代碼:

exports.getList = async function () {
    try {
        const db = await MongoClient.connect(Constants.DB_URL);
        const dbo = db.db(Constants.DB_NAME);
        const result = await dbo.collection(Constants.DB_FEATURE1_COLLECTION).find({}).toArray();
        db.close();
        return result
    } catch (err) {
        console.log(err);
        return undefined
    }
};

和用例.js:

exports.getList = function() { 
    return repository.getList(); // it returns a Promise there is no need to wrap it in async 
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM