【问题标题】:return value remains undefined even when timed out for 10 seconds即使超时 10 秒,返回值仍然未定义
【发布时间】:2021-12-14 13:18:54
【问题描述】:

我遇到了一个问题,我需要返回一个异步函数的响应,该函数一直以未定义的形式返回。所以我决定在尝试使用它之前使用 setTimeout() 。它似乎仍然不起作用。谁能解释一下原因?

我的尝试:

insertUser = (req,res) => {
    var record = {
        'handle': req.body.handle,
        'name': req.body.name,
        'password': req.body.password
    };
    var response;
    createUser(record, response)
    setTimeout(() => {
        console.log(response);
    },10000)
};

createUser = (record, response) => {
    users.insertOne(record, function(err, result){
        if(err){
            response = {'code': 404, 'message': 'Something went wrong. Message: ', err} 
        }else{
            response = {'code': 200, 'message': result.insertedId}
        }
    })
    setTimeout(() => {
        console.log(response)
    }, 1000);
};

【问题讨论】:

    标签: javascript mongodb asynchronous promise settimeout


    【解决方案1】:

    问题是users.insertOne 没有同步运行,函数createUser 在此之前返回,因此您将undefined 作为返回值。

    有几种方法可以解决这个问题 -

    => 使用async/await

    const createUser = async (record, response) => {
        try {
            const result = await users.insertOne(record);
            response = {
                'code': 200,
                'message': result.insertedId
            }
        } catch (err) {
            response = {
                'code': 404,
                'message': 'Something went wrong. Message: ',
                err
            }
        })
        
        return response;
    };
    
    const insertUser = async (req,res) => {
        let record = {
            'handle': req.body.handle,
            'name': req.body.name,
            'password': req.body.password
        };
        let response;
        response = await createUser(record, response);
        console.log(response);
    };
    

    => 使用简单的承诺

    const createUser = (record) => {
        return new Promise((resolve, reject) => {
            users.insertOne(record, function(err, result) {
                if (err) {
                    // Or use `reject` if you want to have this in .catch callback
                    resolve({
                        'code': 404,
                        'message': 'Something went wrong. Message: ',
                        err
                    });
                } else {
                    resolve({
                        'code': 200,
                        'message': result.insertedId
                    });
                }
            })
        })
    };
    
    const insertUser = (req, res) => {
        const record = {
            'handle': req.body.handle,
            'name': req.body.name,
            'password': req.body.password
        };
        let response;
        createUser(record).then((res) => {
            response = res;
            console.log(response);
        });
    };
    

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多