如何将一个Observable解析为另一个Observer?-rxjs
How do I resolve an Observable inside of another Observable? - rxjs
我有一个Observable
,在其中我消耗了另一个可观察到的,但第二个Observable
我无法解析。这是代码:
return Observable.fromPromise(axios(config))
.map(res => {
return {
accessToken: res.data.access_token,
refreshToken: res.data.refresh_token
}
})
.map(res => {
return {
me: getMe(res.accessToken),
accessToken: res.accessToken,
refreshToken: res.refreshToken
}
})
function getMe(accessToken) {
return Observable.fromPromise(axios.get({
url: 'https://api.spotify.com/v1/me',
}));
}
getMe
函数返回一个Observable
,但它从未被解析。我尝试添加一个flatMap
和一个concat
,但仍然没有解决。如何解决getMe
?
您是否尝试了以下操作(同样未经测试):
function getMe(accessToken) {
return Rx.Observable.fromPromise(axios.get({
url: 'https://api.spotify.com/v1/me',
}));
}
Rx.Observable.fromPromise(axios(config))
.map((res) => {
return {
accessToken: res.data.access_token,
refreshToken: res.data.refresh_token
}
})
.flatMap((res) => {
return getMe(res.accessToken).map((res2) => {
res.me = res2;
return res;
}
})
.subscribe((data) => console.log(data));
正如上面文章中提到的,flatMap
返回了一个observable。CCD_ 9随后用于将CCD_ 10与从第二承诺返回的结果CCD_。
还要注意,fromPromise
是一个冷的可观测到的。这意味着你必须有一个订阅才能发起活动。在你的情况下,我想你已经有了这样的东西:
someFunction = () => {
return Rx.Observable.fromPromise(axios(config))
...
...
}
someFunction.subscribe((data) => console.log(data));
正如@user3743222所指出的,Observable
不像Promise
那样是resolve
。如果你想要getMe
方法的值,你需要订阅它返回的Observable
。
return Observable.fromPromise(axios(config))
.map(res => {
return {
accessToken: res.data.access_token,
refreshToken: res.data.refresh_token
}
})
.flatMap(function(tokens) {
//FlatMap can implicitly accept a Promise return, so I showed that here
//for brevity
return axios.get({url : 'https://api.spotify.com/v1/me'});
},
//The second method gives you both the item passed into the first function
//paired with every item emitted from the returned Observable`
//i.e. axios.get(...)
function(tokens, response) {
return {
accessToken: tokens.accessToken,
refreshToken: tokens.accessToken,
//Here response is a value not an Observable
me: response
};
});
下面要查找的示例代码(UNTESTED!!)。一些解释:
- CCD_ 18返回的可观测值不平坦("求解"属于承诺世界),因为CCD_ 19算子不平坦可观测值。
flatMap
可以,但您需要以source.flatMap(function(x){return observable})
的形式使用它,这里返回的是POJO
而不是Rx.Observable
- 因此,为了使
getMe
变平,我们使用flatMap
- 为了加回丢失的字段(
accessToken
和refreshToken
),我们在发射res
对象(res$
)的可观察对象上使用withLatestFrom
-
我们使用
share
,因为我们订阅了两次res$
,并且我们希望所有订阅者都能看到相同的值。var res$ = Observable .fromPromise(axios(config)) .map(function ( res ) { return { accessToken : res.data.access_token, refreshToken : res.data.refresh_token } }) .share(); var getMe$ = res$.flatMap(function ( res ) {return getMe(res.accessToken)}); var finalRes$ = getMe$.withLatestFrom(res$, function ( getMe, res ) { return { me : getMe, accessToken : res.accessToken, refreshToken : res.refreshToken } }); function getMe ( accessToken ) { return Observable.fromPromise(axios.get({url : 'https://api.spotify.com/v1/me'})); }
相关文章:
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 使用clickToggle并在单击另一个元素时关闭元素
- 使用javascript将动态表从一个html页面打印到另一个html页
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 从Rally获取一个特定的标记,以便计算另一个字段中的值
- 无法从jquery Mobile导航栏重定向到另一个页面
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 字符串在将其传递给另一个活动Android JavaScript时读取Null
- 如何在鼠标悬停时在另一个图像上滑动图像.
- 导航到特定事件的另一个变量页面
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- 如何在react js中将值从一个组件发送到另一个组件
- 按我自己的类克隆另一个元素的内容和顺序
- 在另一个函数中使用变量this
- 如何在react js中从一个页面导航到另一个页面
- 在另一个函数成功结束后调用该函数
- 如何将一个Observable解析为另一个Observer?-rxjs