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

pfM*_*usk 10 asynchronous node.js express 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');
}
Run Code Online (Sandbox Code Playgroud)

});

我如何在这个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();
});
Run Code Online (Sandbox Code Playgroud)

Ste*_*her 15

async/await这里使用我的游戏代码做了这件事

假设req.isLoggedIn()返回一个布尔值,它就像下面这样简单:

const isLoggedIn = await req.isLoggedIn();
if (isLoggedIn) {
    // do login stuff
}
Run Code Online (Sandbox Code Playgroud)

或者简写为:

if (await req.isLoggedIn()) {
    // do stuff
} 
Run Code Online (Sandbox Code Playgroud)

确保你有一个async功能!

  • @pfMusk **请**不要为此使用process.nextTick。只需使函数“ async”并使用“ await”,您六个月的时间就会感谢您。 (5认同)

tri*_*cot 6

您可以这样分配函数:

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);
});
Run Code Online (Sandbox Code Playgroud)

然后您可以执行以下操作:

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

不要尝试保持同步模式(if (req.isLoggeedin())),因为这会导致代码设计不良。相反,拥抱完全异步编码模式:一切皆有可能吧。