typescript - 如何在 observable 内部有条件地订阅,等待响应并返回完整结果?
问题描述
我有一个Observable
这样的Promise
(我使用严格的打字稿):
let foo: Subscription = from(channel.getMessages).pipe(flatMap((data: any) => data.items))
// then I subscribe to it like this
foo.subscribe((val: any) => console.log(val))
我需要输入管道flatMap
,因为该channel
对象有一个items
包含所有文本消息的数组属性。这将非常简单,但是有些消息是媒体类型的,在这些情况下,我必须对media.getContentUrl
(也是 a Promise
)进行另一个请求。所以在这种情况下,我必须取回媒体url
而不是短信正文。
到目前为止,我尝试做类似的事情:
let foo = from(channel.getMessages)
.pipe(
flatMap(data => data.items),
map((item: any) => {
if (item.type === 'media') {
return from(item.media.getContentUrl).subscribe((val: any) => val);
}
return item.body;
})
);
这将item.body
正确返回,但当消息为media类型时会出错:TypeError: You provided 'function getContentUrl(): ... where stream was expected
我的目标是有一个可观察的,我在其中收到消息,但是当消息类型是媒体时,我发送另一个请求,等待它,然后我将所有内容重新组合在一起,例如,在我取回数据后,我的数组将如下所示:
messages = [
'foo',
'bar',
'http://example.com/img1.jpg',
'baz',
'http://example.com/img2.jpg'
]
我在反应式思维方式中面临的主要问题是:如何根据某些条件设置一个可能必须在其中包含另一个可观察对象(或简单请求)的可观察对象?你将如何以优雅的反应方式做到这一点?
解决方案
更改map
为flatMap
和不subscribe
内部运算符,flatMap
将为您执行内部可观察
flatMap(data => data.items),
flatMap((item: any) => {
return (item.type === 'media')? from(item.media.getContentUrl()):
of(item.body);
})
还有一个iif
可用的运算符
https://www.learnrxjs.io/operators/conditional/iif.html
但我个人坚持使用原生 javascript
推荐阅读
- javascript - 使用 reactjs 在井字游戏应用程序中渲染图像
- javascript - JSXGraph 在 down 事件后停止板平移
- c# - 如何在没有使用 F#/C# 的 WinForms 的情况下将像素绘制到屏幕上?
- java - 导入的模块 OpenCV 的导入不再可用,导致使用的每个关键字都成为 Android Studio 中的错误
- javascript - 我怎么知道一个字符串中有多少匹配被替换?
- r - 从数据框创建文本字符串
- javascript - 将一个对象的值匹配到另一个对象
- css - 覆盖 Materialise 1.0.0 单选风格
- php - 卷曲水滴参数
- java - Travis 运行检查权限被拒绝错误解决办法?