如何获得变量的价值超出承诺?

时间:2017-09-04 12:24:47

标签: javascript node.js ecmascript-6

我正在尝试将值设置为promise之外的变量。 但当我检查它打印的值undefined时, 我在promise之外定义了变量,所以我不明白为什么它是undefined

这是我的代码,希望你能帮助我:

UserSchema.statics.findByToken = function (token) {
var User = this;
var decoded;

try{
    decoded = jwt.verify(token, 'secret');
} catch (err){

    if(err.name === 'TokenExpiredError'){

        var refreshToken;

        User.findOne({
            'tokens.token': token,
            'tokens.access': 'auth'
        }).then( (user) => {

            User.findOne({
                'tokens.token': token,
                'tokens.access': 'auth'
            }).then( (user) => {
                var access = 'auth';
                token = jwt.sign({_id: user._id.toHexString(), access}, 'secret', { expiresIn: 30 }).toString();

                refreshToken = token; // set value to refreshToken

                user.tokens.push({access, token});

                user.save().then( () => {
                     token = refreshToken;
                });
            });
        });


        console.log(refreshToken);  // refresh is undefined
        return Promise.reject({errName: 'TokenExpiredError', token: refreshToken});

    }

    return Promise.reject();

}

    return User.findOne({
       _id: decoded._id,
       'tokens.token': token,
       'tokens.access': 'auth'
    })
}

1 个答案:

答案 0 :(得分:0)

then之后User.findOne中执行的代码是异步的。所以它将在以后执行。执行console.log(refreshToken);时,代码尚未执行。所以refreshToken仍未定义。