【问题标题】:async await not waiting for resolve异步等待不等待解决
【发布时间】:2020-03-08 05:25:17
【问题描述】:

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

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的响应

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

【问题讨论】:

  • 你有两个return undefned。也许承诺正在解决,解决的值是undefined,因为这就是返回的内容?
  • 您在控制台中看到任何错误日志吗?
  • 不,对两者来说,控制台上都没有错误,并且存储库实际上正在正确返回列表,我进行了调试,它在返回结果之前继续执行其余的函数

标签: javascript node.js


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 2018-04-17
    • 2019-06-20
    • 2016-07-07
    • 2016-03-25
    • 2017-10-09
    相关资源
    最近更新 更多