javascript - 如何将 Observable 内部的值作为 Angular 2+ 中的函数返回

标签 javascript angular ionic3 observable angularfire2

好吧,基本上我一直在努力使用用户 ID 来获取存储在 firebase 中的用户详细信息。

我有一个项目列表,其中包含对象中的用户 ID。我希望将此用户 ID 传递给类似的函数

<div *ngFor="let item of items">
    <p>{{getUsername(item.userId)}}</p>
</div>

在应用程序的 html 部分。

然后使用这个 ID,我想提取用户名等,它也存储在 firebase 中,并且具有与相同用户 ID 相同的 key 。

以下选项是我已经尝试过的;

选项 1(只是同一组件的函数)

输出未定义,我相信这是因为函数运行并且 在订阅将数据传递到之前返回用户名变量 它。

constructor(public db: AngularFireDatabase){}

getUserName(id) {
    var username;
    this.db.object('users/' + id).valueChanges().subscribe(v => {
        username = v['username'];
    });
    return username;
}

选项 2(创建服务 - 可注入(inject),以便将其传递给对象属性)

输出我需要的内容,但它对所有列表元素显示相同的内容

username;

constructor(public db: AngularFireDatabase){}

getUserName(id) {
    this.db.object('users/' + id).valueChanges().subscribe(v => {
        this.username = v['username'];
    });
    return this.username;
}

所以我需要的是类似于选项1的东西,但是一旦可观察对象获取数据并将其传递给函数内部的变量,它就需要返回可观察对象内部的值,这样它就不会返回未定义值。

最佳答案

这里的一个重要概念是,Observable 是异步的,因此您不能像使用常规值那样“返回”它的值。您必须等待它发出一个值,然后才能返回该值。在这里阅读更多相关信息:https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 .

对于您想要具体执行的操作,我建议您仅获取 Observable 并在模板中需要时使用“异步”管道。

getUserData(id): Observable<YourData> {
  return this.db.object('users/' + id).valueChanges();
}

然后在您的模板中,您可以执行以下操作:

<li *ngFor=let user of users"> {{ getUserData(user.id) | async }}</li>

如果您知道组件中的用户id,并且想要获取该用户的用户数据并在组件代码中使用它,您可以执行以下操作:

userData: YourData;
@Input() id: any; // provided by parent component

ngOnInit() { // OnInit lifecycle hook
  this.db.object('users/' + this.id).valueChanges().subscribe(data => this.userData = data);
}

但请记住处理订阅的清理。

关于javascript - 如何将 Observable 内部的值作为 Angular 2+ 中的函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48463685/

相关文章:

javascript - HTML 表单方法与 jQuery 函数类型

javascript - Algolia Search typeahead 实现

javascript - 在多个组件中调用一个组件。 Angular 4

ios - 如何防止ionic 3应用程序卡住?

d3.js - 将项目从 ionic 2 升级到 ionic 3 后显示找不到模块 "d3"错误

javascript - 具有 API 和数据库查询的 Node.js Promise Chain

javascript - 计算对象不同属性的值

angular - 如何在没有互联网的情况下安装angular-cli

angular - 当属性在 angular 4 中没有改变时如何强制更新模板

css - 如何在 Ionic 3 的 ion-navbar 中内联按钮和 ion-title?