JavaScript在if语句中等待异步函数

时间:2018-01-29 18:47:33

标签: node.js express asynchronous ecmascript-6 passport.js

我在if语句中有一个函数

isLoggedin()有一个异步调用。

router.get('/', function(req, res, next) {
if(req.isLoggedin()){ <- never returns true
    console.log('Authenticated!');
} else {
    console.log('Unauthenticated');
}

});

我如何在这个if语句中等待isLoggedin()?

这是我的isLoggedin功能,我使用护照

app.use(function (req, res, next) {
   req.isLoggedin = () => {
        //passport-local
        if(req.isAuthenticated()) return true;

        //http-bearer
       passport.authenticate('bearer-login',(err, user) => {
           if (err) throw err;
           if (!user) return false;
           return true;

       })(req, res);
   };

   next();
});

2 个答案:

答案 0 :(得分:8)

我在游戏代码here

中使用async/await执行此操作

假设req.isLoggedIn()返回一个布尔值,它就像:

一样简单
const isLoggedIn = await req.isLoggedIn();
if (isLoggedIn) {
    // do login stuff
}

或者简写为:

if (await req.isLoggedIn()) {
    // do stuff
} 

确保你已经在async功能中使用了它!

答案 1 :(得分:3)

您可以宣传您的功能,如下所示:

req.isLoggedin = () => new Promise((resolve, reject) => {
    //passport-local
    if(req.isAuthenticated()) return resolve(true);

    //http-bearer
   passport.authenticate('bearer-login', (err, user) => {
       if (err) return reject(err);
       resolve(!!user);
   })(req, res);
});

然后你可以这样做:

req.isLoggedin().then( isLoggedin => {
    if (isLoggedin) {
        console.log('user is logged in');
    }
}).catch( err => {
    console.log('there was an error:', err); 
});

不要试图保持同步模式(if (req.isLoggeedin())),因为它会导致设计不良的代码。相反,完全接受异步编码模式:任何事都可以使用它。