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语句中等待异步函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章