2016-05-31 61 views
2

我不知道如何使用的用户做一个非常简单的Angular2:Angular2使用订阅人数为承诺

a() { 
    return getValueFromService() // Return Observable 
    .subscribe(callA) 
} 

b() { 
    a().subscribe(callB) // This won't work as a() return a Subscriber 
} 

基本上,我想确保我的callB会经常来我的马蹄莲后。 这就像a()返回一个Promise和使用then()就可以了。

我正在使用最新的Angular2测试版。

回答

1

你可以充分利用do操作:

a() { 
    return getValueFromService() // Return Observable 
    .do(callA) 
} 

b() { 
    a().subscribe(callB) // This won't work as a() return a Subscriber 
} 

subscribe方法不返回可观察到的,但订阅...的do操作返回一个新的观察到的,所以你可以在上面订阅。当你想触发某些东西但不处理结果时,必须使用它(结果不会在异步数据流中传播)。

另一种选择是利用了flatMap运营商,如果你想获得认购回调中的getValueFromService结果:

a() { 
    return getValueFromService() // Return Observable 
    .flatMap(callA) 
} 

b() { 
    a().subscribe(callB) // This won't work as a() return a Subscriber 
} 

在这种情况下,callA必须返回一个可观察的。

1

可以

a() { 
    return getValueFromService() // Return Observable 
    .toPromise().then(callA); 
} 

b() { 
    a().toPromise().then(callB); // This won't work as a() return a Subscriber 
} 

然后调用它像

a().then(b); 
+0

相信观测量现在的新标准,我想尽量避免使用承诺。我不确定你现在在哪个版本的Angular2中,但是在我的Observable上没有toPromise()。 – Scipion

+0

'toPromise'是一个运算符,和每个运算符一样,它需要像'import'rxjs/add/operator/toPromise';'一样导入。有一些关于观测值的宣传,他们有一些优势。尽管“承诺”仍然有效。如果你更喜欢'Observable',那么Thierrys的答案应该适合你的需要。 –

+1

我的不好,实际上我忘了添加操作符。谢谢你在这里的贡献先生。 – Scipion