【问题标题】:Use Promise function in Angular 6 Data Binding在 Angular 6 数据绑定中使用 Promise 函数
【发布时间】:2018-11-10 23:34:09
【问题描述】:

我在 Angular 6 数据绑定中使用异步函数时遇到问题:

<span *ngIf="application.status == 'in-progress'; else new">
  {{getAssignedUser(application.user_id)}}
</span>

getAssignedUser() 是一个异步函数,它从 Firestore 获取文档,我想显示我从 Firestore 收到的分配用户的名字。这里唯一的问题是我无法显示名字值 OnInit。如果我插入一个按钮并添加一个单击事件,它会显示名称。

组件:

async getAssignedUser(id): Promise<string> {
    if (id != null) {
        return this._usersService
        .getUserById(id)
        .then(data => {
            this.assignedUser = data.user_fname;
            return this.assignedUser;
        })
    } else {
        return null;
    }
}

服务:

getUserById(id): any {
    let user: any;
    user = this.afs.collection('agents').doc(id).ref.get().then(function (doc) {
        if (doc.exists) {
            user = doc.data();
            console.log(user);
            return user;
        }
        else {
            console.log('No such document');
        }
    }).catch(function (error) {
        console.log('Error getting document: ', error);
    })
    return user;
}

有什么帮助吗?

【问题讨论】:

  • 您能否为我们提供一个堆栈闪电战,以更清楚地说明您的示例?
  • 你想显示什么?你正在做{{getAssignedUser(application.user_id)}},但getAssignedUser 返回一个Promise。您可以使用async 管道,例如{{getAssignedUser(application.user_id) | async }}
  • @user184994 我实际上正在尝试显示一个字符串。我不知道如何从 Promise 中获取字符串值。它与点击事件一起工作。更准确地说,我实际上是在使用 id 从另一个 Firestore 文档中检索数据并希望访问该文档的值。
  • 您可以尝试使用async 管道来获取值,即{{getAssignedUser(application.user_id) | async }}
  • 这是从模板中调用函数的缺点之一:每个更改检测周期都会调用该函数。相反,为什么不在ngOnInit 中调用getUserById,而只在模板中使用{{assignedUser}}

标签: javascript angular typescript google-cloud-firestore angular6


【解决方案1】:

问题

从 html 调用 getAssignedUser 并期望返回值的问题。这不能保证,因为getAssignedUser 执行异步操作。您曾提到 getAssignedUser 上的异步操作,但不会返回任何 ObservablePromise

解决方案

您需要更改服务和组件。函数应该返回 Promise 来处理这种情况。

服务:

  getUserById(id): any {

    return new Promise((resolve, reject) => {

      this.afs.collection('agents').doc(id).ref.get().then(function (doc) {
        if (doc.exists) {
          user = doc.data();
          console.log(user);
          resolve(user);
        }
        else {
          resolve(null); //<-- you can reject if you want.
        }
      }
    }
  }

组件:

async getAssignedUser(id): Promise<string> {
        return this._usersService
        .getUserById(id);
}

html

<span *ngIf="application.status == 'in-progress'; else new">
  {{getAssignedUser(application.user_id)} | async}
</span>

重要提示:您不应该在 html 中运行,这可能会导致多次调用并影响性能。最好使用函数。

注意:代码直接写入 stackoverflow 编辑器,因此可能存在拼写错误或语法错误。所以请纠正自己。

【讨论】:

  • async 仅对 observable 是必需的,而不是对 promises 而言。
  • @sleepz - 请创建 stackblitz 演示以更快更轻松地修复它。
【解决方案2】:

同意@Sunil Singh 以上答案,模板文件中的小修正。 async 操作符主要用于 observable。您可以在没有它的情况下调用它应该可以工作。

<span *ngIf="application.status == 'in-progress'; else new">
  {{getAssignedUser(application.user_id)}}
</span>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2017-03-11
  • 2019-06-27
相关资源
最近更新 更多