【问题标题】:send observable while object is not instanciate在对象未实例化时发送可观察对象
【发布时间】:2017-08-25 16:02:54
【问题描述】:

我有一个逻辑问题,当它感觉可行时,我无法用 observable 解决。它是(我期望的)工厂模式的一部分?

问题是: -我有一个带有参数'p'的类'Cl'。 -在'Cl'构造函数中,我发出一个http请求来获取p的正确值(是的,这部分也感觉很奇怪) -'Cl' 有一个 getter,它返回 'p' 或其中的一部分。

当我做instance = new CL(); instance.get(); 当然我的http 请求还没有完成。所以'p'是未定义的。 getter 能否返回一个仅在 p 得到定义时才被接受的 observable ?

也许一些代码可以更好地解释这种情况:

import {lot of thigs } from '@angular/core'; //and RxJs

@Component({
//...
})
export class aClass {
private p:any

constructor() {
    this.p = return this.Http.get('a/route')//let's say this request take AGE
    .map((response) => { 
        return response.json(); 
    });
}

//Obviously no working cause cause p isn't "define yet"
public getP(index){
    return this.p[index];
}

//I'd hope something like this would work but it doesn't.
public getObservableP(index): Observable<any>{
    return Observable.of(this.p[index]);
}

}

你能告诉我如何返回一个 Observable (或者如果它应该是一个 Promise),它会在 p 实例化时实现。谢谢。

(我已经阅读了一些关于构造函数中的http请求不好的东西,也许我的概念在这里是错误的)。

【问题讨论】:

  • 首先,promise 是异步的,所以在我们的模板中?检查承诺是否完成。第二次尝试保存承诺。 this.p = 响应;第三个可能会为 this.p. 做一个吸气剂。
  • @Swoox 对不起,我读了两遍,但我不明白这个。
  • 您尝试返回一个不存在的对象。因为您的申请比您的承诺更快​​。
  • 确实如此。这就是为什么我正在寻找一个 Obersvable/promise 仅在 p 实例化时才会解决的原因。我可以在 getter 中发送这个 Observable/promise
  • 你在模板中使用这个吗?

标签: angular typescript observable


【解决方案1】:

如果发布的代码充当服务,最好的办法是像这样使用异步管道:

import {lot of thigs } from '@angular/core'; //and RxJs

@Component({
//...
})
export class aClass {
private p:any

constructor() {
    this.p = return this.Http.get('a/route')//let's say this request take AGE
    .map((response) => { 
        return response.json(); 
    });
}

public getP(index){
    return this.p;
}
}

在您的组件中,您将在模板中注入 aClass:

<div *ngFor="let something of aClass.getP() | async">
    {{something}}
</div>

<p>{{aClass.getP() | async}}</p>

【讨论】:

  • 我想这会奏效。只是为了确定,你知道getter异步的方法,而不是把它放在模板中
  • 你需要返回一个 observable(就像我写的那样)。然后你可以在组件代码中使用它来订阅它。假设您有一个注入 aClass 服务的组件,并且该服务有一个方法 getP 可以返回您的 observable。然后在你的组件中你可以写this.aClass.getP().subscribe((result) =&gt; result); 在订阅块中你可以将结果保存到一个变量中,过滤它等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2018-07-29
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
相关资源
最近更新 更多