我试图理解 observables 并遇到了一些挫折。
我有一个save()
函数可以调用initialize()
获取一些 Id。在 initialize 内部,我在 map 方法 ( payload
) 中设置了一个 Observable,当我将结果记录到控制台时,它会被设置为正确的值。我试过切换地图订阅无济于事。
TLDR;从地图/订阅内部为预先提升的变量设置值的正确方法是什么?
相关:如果从对象序列化,什么是正确的 observable 类型?
save(post: Post, draftId?: number, postId?: number): Observable<any> {
let payload: Observable<any>;
if (!postId) {
post.state = post.state ? post.state : 'unsaved';
this.initialize(post)
.subscribe((res) => { //error here... cannot run
console.log('Waypoint: posts.service.ts:36');
payload = res;
});
} else if (draftId && postId) {
post.state = 'autosaved'
return this.updateDraft(post, draftId);
};
return payload;
}
initialize(post: Post): Observable<any> {
let resultPost: number;
let resultDraft: number;
var payload: Observable<any>;
this.createPost(post)
.subscribe(res => {
resultPost = res.id;
post.postId = res.id
this.createDraft(post)
.map(res => {
resultDraft = res.id;
let _payload = {
postId: resultPost,
draftId: resultDraft
};
console.log('Waypoint: posts.service.ts:62');
payload = Observable.create(_payload); // looks good!
}, (error) => { console.log(error) }).subscribe();
});
console.log(payload); //undefined :(
return payload;
}
如果我理解正确,你的逻辑或多或少是这样的
createPost
方法,它返回一个Observable
subcribe
去createPost
,你会得到包含Post id的结果createDraft
再次返回一个Observable
subscribe
将createDraft
获得草稿 ID我是对的,你可能应该瞄准的是这样的
let postId;
let draftId;
this.createPost(post)
.map(res => {postId = res.id})
.mergeMap(() => this.createDraft(post)) // mergeMap is same as flatMap
.map(res => {draftId = res.id})
.map(() => [postId, draftId])
.subscribe(postDraftIds => payload = postDraftIds)
还有其他方法可以使用 Observable 运算符来达到相同的目标(例如,您可以使用 switchMap 而不是 mergeMap - 这里有一个很好的链接,解释了 switchMap 的工作原理),但我希望这足够清楚
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句