【问题标题】:'Promise' is not assignable to type 'Model' - Angular2 / Firebase'Promise' 不可分配给类型'Model' - Angular2 / Firebase
【发布时间】:2017-01-15 15:39:49
【问题描述】:

我的服务中有以下方法,它从 Firebase 返回一条与传入的 bugId 匹配的记录:

// 请注意,它位于 bugservice.ts 中

   getBug(bugId: string): Promise<Bug> {

    return this.bugsDbRef
        .child(bugId)
        .once('value')
        .then(snapshot => {
            const bugInfo = snapshot.val() as Bug;
            bugInfo.id = snapshot.key;
        }) as Promise<Bug>;
}

在我的 bugDetail 组件中,我将上述服务注入到我的 bugDetail 组件中,然后调用上述方法,如下所示:

export class BugDetailComponent implements OnInit, OnDestroy {

private subscription: Subscription;

private bugDetail: Bug = new Bug(null,null,null,null,null,null,null,null,null); // Trying to populate from Service Call i.e getBug    
private bugId: string; // Come from URL

constructor(private bugService: BugService, private activatedRoute: ActivatedRoute) { }

ngOnInit() {
    this.configureForm();

    this.subscription = this.activatedRoute.params.subscribe(
        (param: any) => {
            this.bugId = param['id'];
        });

    const t = this.bugService.getBug(this.bugId);

    console.log(t);

}
}

但是,当我使用 console.log 时,控制台中会显示以下内容:

当我删除 t 并将其替换为

this.bugDetail = this.bugService.getBug(this.bugId);

我得到的错误信息是:

类型“Promise”不可分配给类型“Bug”。 “Promise”类型中缺少属性“id”。

有人可以向我解释如何访问从 BugDetail 组件中的服务检索到的错误详细信息吗?

【问题讨论】:

  • 这是预期的行为;您正在记录 Promise。要获得Bug,您需要调用this.bugService.getBug(this.bugId).then(bug =&gt; console.log(bug)); 此外,其他地方是您的代码,您可以调用new Bug(...)。如果Bug 是一个类,您不能snapshot.val() 转换为Bug,因为它不是Bug 实例。
  • 好吧,现在我很困惑,在我的 getBug 方法中,我返回一个 Promise ,它告诉我我正在传回一个错误对象。在我的错误详细信息组件中,我调用此方法并对其进行扩展以适应您刚刚指定的附加 .then 函数。你能帮我看看 getBug 函数的代码和调用 getBug 的方法吗?我被这个承诺的东西弄糊涂了。

标签: angular typescript firebase firebase-realtime-database


【解决方案1】:

getBug 返回一个 Promise&lt;Bug&gt; - 这是一个将解析为 Bug 值的承诺。 Promise 异步解析,解析后的值可用于传递给 Promise 的 then 方法的函数。这是您访问解析值的唯一方法。

你可以分配给this.bugDetail,像这样:

this.bugService
    .getBug(this.bugId)
    .then(bug => { this.bugDetail = bug; });

您可能想阅读JavaScript Promises: an Introduction

【讨论】:

  • 感谢您的分解和链接。当我尝试将 snapshot.val() 转换为作为类的 Bug 时,我需要对 getBug 方法进行哪些更改。有没有办法可以用 observables 做到这一点?
  • 你不能施放它。您需要使用它或其属性来创建 Bug 实例,方法是使用 Bug 构造函数采用的任何参数调用 new Bug(...)
  • 好的,有道理,我只是设法在服务中使用 Observable 使其工作,在我订阅此事件的错误详细信息组件中,这可能是另一种正确的方法吗?
  • 无论采用哪种方式,都不能将snapshot.val() 转换为Bug,因为快照的值不是Bug 实例;这是一个匿名对象。
猜你喜欢
  • 1970-01-01
  • 2017-10-23
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多