通过异步回调到类的构造函数,使用打字稿和节点/护照
我使用的passport-http
认证库,它的文档使用回调 - 但我使用打字稿类与异步/ AWAIT,所以我不能确定的语法。
图书馆想要一个verify
回调,其查询数据库 - 这是一个异步操作。我把它定义为一个单独的异步函数(所以它更容易测试):
public verify = async (username: string, password: string, done: (error: any, user?: any) => void): Promise<void> => {
// read from database asynchronously...
try {
const user = await this.UserRepository.findByUsername(username);
if (!user)
return done(null, false);
if (user.Password !== password)
return done(null, false);
return done(null, user);
}
catch (e) {
return done(e);
}
}
然后,我把它提供给图书馆:
//public async init(): Promise<void> { // also works
public init(): void {
const strategy = new PassportBasicStrategy(this.verify); // async callback!
passport.use(strategy);
}
我的问题:
- 我若为
init()
而不是async init()
的它的工作原理。我认为这是因为如果该函数有一个async
只需要await
修改? - 但是我通过异步回调到该构造,在同步功能!...是正确的?
async
是返回一个承诺定期功能语法糖。如果函数不使用await
,它不会被async
受益。
如果接受回调API不使用它返回一个承诺,这是潜在的问题。这是可以接受的使用的承诺,因此async
,只要这种关注解决。由于API不会处理拒绝,就应该由用户来处理:
verify = async (username: string, password: string, done: (error: any, user?: any) => void): Promise<void> => {
try {
// reads from the database asynchronously...
done(null, user);
} catch (err) {
done(err);
}
}
不调用done
回调会导致不正确的行为,即使返回的承诺得到解决。
但是我通过异步回调到该构造,在同步功能
PassportBasicStrategy
接受潜在异步回调,这就是为什么有回调参数done
。没关系的功能是否async
与否,只要返回承诺不会造成任何影响。