JavaScript在if语句中等待异步函数[重复]

Posted

技术标签:

【中文标题】JavaScript在if语句中等待异步函数[重复]【英文标题】:JavaScript wait for asynchronous function in if statement [duplicate] 【发布时间】:2018-07-08 13:08:30 【问题描述】:

我在 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();
);

【问题讨论】:

【参考方案1】:

我在我的游戏代码here 中使用async/await 来做这件事

假设req.isLoggedIn() 返回一个布尔值,它很简单:

const isLoggedIn = await req.isLoggedIn();
if (isLoggedIn) 
    // do login stuff

或简写为:

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

但请确保您在 async 函数中包含它!

【讨论】:

有没有办法使用 process.nextTick() 代替?因为我想保留我的语法 if(req.isLoggedin()) 有什么特别的原因吗?我不认为同步到下一个事件循环比 Promise 有好处 因为我想保留我的语法 if(req.isLoggedin()) :) 效率会低很多吗? 效率可以忽略不计,但nextTick 确实具有更高的效率,因为 Promises 创建 2 并丢弃一个,但是我从来没有使用 nextTick 来处理异步行为,我真的没有知道的人太多了。我得做更多的研究 @pfMusk 不要为此使用 process.nextTick。只需创建函数async 并使用await,6 个月后您会感谢您。【参考方案2】:

你可以promisify你的函数,像这样:

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())),因为这会导致代码设计不佳。相反,拥抱完全异步编码模式:一切皆有可能。

【讨论】:

以上是关于JavaScript在if语句中等待异步函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript异步/等待:等待后代码不会继续[重复]

我收到“等待仅在异步函数中有效”错误我的代码是这样的 [重复]

使用 setTimeout 连续异步/等待 [重复]

如何在c#中正确实现等待异步[重复]

如何在.NET中调用异步函数而不等待它[重复]

Promise.all()函数中的JS“等待仅在异步函数中有效”[重复]