异步等待不等待解决

时间:2020-03-07 21:05:16

标签: javascript node.js

所以,在我的nodeJS项目中,我有这部分代码,即没有等待await调用

Controller.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)
}}

这是控制器上的函数,它调用useCase的响应

UseCase.js

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

还调用存储库

Repository.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的响应。那我在做什么错了?

1 个答案:

答案 0 :(得分:2)

getList函数没有return语句,由于它是async,所以它返回始终以undefined解析的Promise。我对MongoClient不太熟悉,但是documentation says如果未指定回调,它将返回一个Promise。因此,您可以更改代码:

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
    }
};

和UseCase.js:

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