【问题标题】:TypeScript nested asynchron functionsTypeScript 嵌套的异步函数
【发布时间】:2019-10-02 18:59:45
【问题描述】:

profile.page.ts:

  username: string;
  totalScore: number;
  ...


  loadUserData() {
    this.spinnerDialog.show();
    this.firebaseServie.loadUserData().then(() => {
      this.username = this.sessionData.getUser().getUsername();
      this.totalScore = this.sessionData.getUser().getTotalScore();
       ....
    });

firebase.service.ts:

async loadUserData() {
    console.log(this.sessionData.getUser().getEmail());
    this.userCollection = this.afs.collection('users', ref => ref.where('email', '==', this.sessionData.getUser().getEmail().toLowerCase()));

    this.userDoc = this.afs.collection("users").doc(this.sessionData.getUser().getEmail().toLowerCase());

    this.x = this.userDoc.valueChanges().subscribe(((item: User) => {
      this.userLoadedUser = item;
      console.log("Found user by email id " + this.sessionData.getUser().getEmail() + ":" + this.userLoadedUser.username);
      this.sessionData.getUser().setUsername(this.userLoadedUser.username);
      this.sessionData.getUser().setTotalScore(this.userLoadedUser.totalScore);
      ....

    }));
  }

那么我如何确定then() 子句中的部分只有在我们从firebase 获得数据后才执行?

我已经编辑了我的问题以便更好地理解。

【问题讨论】:

    标签: typescript asynchronous


    【解决方案1】:

    您可以简单地在您的firebase.service.ts 中返回一个新的 Promise:

    loadUserData() {
        return new Promise((resolve, reject) => {
            ...
            this.x = this.userDoc.valueChanges().subscribe(((item: User) => {
                ...
                resolve(); // If everything worked!
            }));
            ...
        });
    }
    

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      由于 subscribe 表明你正在处理一个 observable,最好不要开始与 promise 混合,而只需使用 observable 和 pipe

      otherfunc()
          .pipe(map(myfunc))
          .subscribe((item:User) => {
      
      });
      

      如果你真的想要 Promise,你可以将 observable 转换为 Promise。

      otherfunc().toPromise().then(myfunc).then(e => {
          // runs after
      });
      

      【讨论】:

      • 如果上面的功能在页面组件上,下面的功能在服务中怎么办?
      • 然后简单调用Service方法。只要它可以访问,它在哪里并不重要
      • 是的,但是.pipe(map(myfunc)) 要求我将页面模块导入到服务中,这不是一种好的编程风格。请参阅我的profile.page.ts(角度)我有this.firebaseServie.loadUserData().then(() => { // here html field values are set,然后我有我的firebase.service.tsasync loadUserData() { .... this.x = this.userDoc.valueChanges().pipe().subscribe(((item: User) => { // here I load the data from firebase,所以只有在加载firebase数据后,才应该设置html字段的值。这就是我想要的
      • 我已经编辑了我的问题以便更好地理解
      猜你喜欢
      • 2012-10-12
      • 2014-10-05
      • 2021-02-04
      • 1970-01-01
      • 2014-06-23
      • 2018-10-28
      • 2021-03-21
      • 1970-01-01
      相关资源
      最近更新 更多