【问题标题】:JavaScript wait for asynchronous function in if statement [duplicate]JavaScript在if语句中等待异步函数[重复]
【发布时间】: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();
});

【问题讨论】:

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


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

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2022-01-01
      • 1970-01-01
      • 2016-12-06
      相关资源
      最近更新 更多