Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.7k views
in Technique[技术] by (71.8m points)

async/await拿不到想要的返回值

问题描述

问题出现的环境背景及自己尝试过哪些方法

需要是这样的,我从前端发送了用户和密码到后端addUser接口注册用户密码。注册成功之后返回一个token,也就是注册及登录。后端数据库采用的mongdb、框架为koa。现在遇到了一个问题:
我想在注册成功之后获取随机数token,但是在let token=await userInformation1.save()这一行。token一直为undefined。看了结果,显示一直是先执行的console.log('外result', result),再执行的保存语句。但是await就是用来暂停等待右侧函数执行结果的啊。
我打印出了else中返回值result的typeof类型为String,就是await等的结果是string,这样说就可以直接赋值给token了啊,但为什么还是先执行下面的语句呢?

相关代码

const addUser = async (ctx) => {//注册添加用户,并返回token直接登录。
    var username = ctx.request.query.username;
    let password = jsencrypt.decrypt(ctx.request.query.password);
    let userInformation1 = new userInformation(
        {
            name: username,
            password: password
        });
    let token= await userInformation1.save(async function (err) {
        if (err) {
            var result = err;
            return result;
        }
        else {
            console.log(ctx.request.query.username);
            var result = random(8, { letters: false });
            console.log('result' + result)
            console.log("添加新用户成功" + username, password)
            return result
        }
    });
    console.log('外result', token)
    ctx.response.body = {
        token
    }
}

你期待的结果是什么?实际看到的错误信息又是什么?

现在的代码给我的感觉是await没起暂停的效果,还是先运行console.log('外result', token)这句代码。

现在结果如下(以用户名admin6和密码123456为例):
''
外result undefined
admin6
token08591194
添加新用户成功admin6 123456
''
已被困扰了一下午,重新看了看回调的书,但还是没有问题的头绪。诚恳希望各位指点!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Promise包裹下callback:

const addUser = async (ctx) => {//注册添加用户,并返回token直接登录。
    var username = ctx.request.query.username;
    let password = jsencrypt.decrypt(ctx.request.query.password);
    let userInformation1 = new userInformation(
        {
            name: username,
            password: password
        });

    // 用Promise包裹下callback
    let token = await new Promise(resolve => {
        userInformation1.save(function (err) {
            if (err) {
                return resolve(err);
            }

           console.log(ctx.request.query.username);
            var result = random(8, { letters: false });
            console.log('result' + result)
            console.log("添加新用户成功" + username, password)
            resolve(result);
        });
    });

    console.log('外result', token)
    ctx.response.body = {
        token
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...