最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

通过异步回调到类的构造函数,使用打字稿和节点护照

运维笔记admin14浏览0评论

通过异步回调到类的构造函数,使用打字稿和节点/护照

通过异步回调到类的构造函数,使用打字稿和节点/护照

我使用的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与否,只要返回承诺不会造成任何影响。

发布评论

评论列表(0)

  1. 暂无评论