【问题标题】:Angular Wait for boolean function to finishAngular 等待布尔函数完成
【发布时间】:2018-06-17 06:43:07
【问题描述】:

我正在尝试从我的 firestore 数据库中获取用户列表,并确定登录用户是否是管理员(即他在列表中)。

这是我的代码:

isAdmin(user: any): boolean {
    var col = this.afs.collection('admins');
    var docRef = col.doc('mini-admins');
    docRef.ref.get().then(function (doc) {
      if (doc.data().user == user)
        return true;
    }).catch(function (error) {
      console.log("Error getting document:", error);
    });
    return false;
}

但是,即使用户是管理员,该功能也不起作用。看起来它并没有在继续之前等待它完成。

我该如何解决这个问题?

【问题讨论】:

    标签: angular asynchronous angular-promise


    【解决方案1】:

    它不起作用,因为它是异步的。要使其正常工作,您需要将其稍微更改为:

    isAdmin(user: any): Observable<boolean> {
        return new Observable(observer => { 
           var col = this.afs.collection('admins');
           var docRef = col.doc('mini-admins');
           docRef.ref.get().then(function (doc) {
              if (doc.data().user == user) {
                  observer.next(true);
                  observer.complete();
              }   
           }).catch(function (error) {
              observer.error(error);
              observer.complete();
              console.log("Error getting document:", error);
           });
        });
    }
    

    然后在你的代码中,当你想检查用户是否是管理员时,通过以下方式调用这个函数:

    this.isAdmin(user).subscribe(success => { ... }, error => { ... });
    

    【讨论】:

    • 很抱歉放弃您对我的回答的编辑。你是对的,但我一开始没有看到。
    • 没问题,没关系:)
    【解决方案2】:

    .then 表示ref.get 是一个异步函数。你不能等待异步函数。您只能返回从它返回的 Promise 或正确链接的新 Promise,并在调用者站点上传递另一个回调以在 Promise 完成时执行代码:

    isAdmin(user: any): Promise<boolean> {
        var col = this.afs.collection('admins');
        var docRef = col.doc('mini-admins');
        // vvv added return
        return docRef.ref.get().then(function (doc) {
          return doc.data().user == user;
        }).catch(function (error) {
          console.log("Error getting document:", error);
        });
    }
    

    然后像这样使用它

    this.isAdmin(user).then(response => {
      if(response) {
        ...
      } else {
        ...
      }
    });
    

    【讨论】:

    • 给我一个错误:'属性'then'在类型'boolean'上不存在。'
    • 错误:“类型 'Promise' 不可分配给类型 'boolean'。”
    • 抱歉,未能修复返回类型 - 再次更新
    • 输入'承诺' 不可分配给类型 'Promise'。输入'布尔| void' 不可分配给类型 'boolean'。类型“void”不可分配给类型“boolean”。
    • 您能否尝试在console.log... 之后在.catch( 块中添加return false; 并告诉我错误是否消失?
    猜你喜欢
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2019-06-16
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2022-11-19
    相关资源
    最近更新 更多