Typescript 完成时发出相同可见光的可见光链
我希望在rxjs中做到这一点:Typescript 完成时发出相同可见光的可见光链,typescript,rxjs,observable,Typescript,Rxjs,Observable,我希望在rxjs中做到这一点: 我有N个http调用 我想按顺序拨打这些电话 我想把每次调用的结果映射到一个可观察的信息流中 非工作伪代码: class InfoMessage { constructor(public message: string) {} } doAllRequests() : Observable<InfoMessage> { return Observable.create((obs: Observer<InfoMessage>)
- 我有N个http调用李>
- 我想按顺序拨打这些电话李>
- 我想把每次调用的结果映射到一个可观察的信息流中李>
class InfoMessage {
constructor(public message: string) {}
}
doAllRequests() : Observable<InfoMessage> {
return Observable.create((obs: Observer<InfoMessage>) => {
doRequest("http://test1.com").map((res: RxRequestResponse) => obs.next(new InfoMessage("request1 done")));
doRequest("http://test2.com").map((res: RxRequestResponse) => obs.next(new InfoMessage("request2")));
doRequest("http://test3.com").map((res: RxRequestResponse) => obs.next(new InfoMessage("request3")));
obs.complete();
});
}
doRequest(url: string) : Observable<RxRequestResponse> {
// use some http client which is wrapped in an Observable of type RxRequestResponse
}
doAllRequests().subscribe(next => console("Message: " + next.message));
class信息{
构造函数(公共消息:字符串){}
}
doAllRequests():可观察{
返回可观察的。创建((obs:Observer)=>{
多勒奎斯特(”http://test1.commap((res:RxRequestResponse)=>obs.next(新信息消息(“请求1完成”));
多勒奎斯特(”http://test2.commap((res:RxRequestResponse)=>obs.next(newinfomessage(“request2”));
多勒奎斯特(”http://test3.commap((res:RxRequestResponse)=>obs.next(newinfomessage(“request3”));
obs.complete();
});
}
doRequest(url:string):可观察{
//使用一些包装在RxRequestResponse类型的可观察对象中的http客户端
}
doAllRequests().subscribe(next=>console(“Message:+next.Message”);
更新马丁建议的答案:
您的回答似乎有效,但前提是我同意第一个请求,如下所示:
Observable.create((observer: Observer<InfoMessage>) => {
doRequest("http://test1.com")
.do(response => observer.next(new InfoMessage("request1 done")))
.concatMap(() => doRequest("http://test2.com"))
.do(response => observer.next(new InfoMessage("request2")))
.concatMap(() => doRequest("http://test3.com"))
.do(response => {
observer.next(new InfoMessage("request3"));
observer.complete();
}).subscribe();
})
Observable.create((观察者:观察者)=>{
多勒奎斯特(”http://test1.com")
.do(response=>observer.next(newinfomessage(“request1 done”))
.concatMap(()=>doRequest(“http://test2.com"))
.do(response=>observer.next(新的InfoMessage(“request2”))
.concatMap(()=>doRequest(“http://test3.com"))
.do(响应=>{
observer.next(新信息消息(“request3”);
observer.complete();
}).subscribe();
})
我真的很想推迟订阅,并将其留给doAllRequests()的调用者。有什么想法吗
更新:昆汀建议的答案
该解决方案可以工作,而且对于我将要运行的大型脚本(有许多请求),在代码的冗长性方面(或者更确切地说是缺少代码),它可以更好地扩展
因为这是我现在最终使用的答案,所以我正在更改我接受的答案。但是马丁,我确实为此感到内疚。我还有一票支持你。。。好吗?如果每个HTTP调用都独立于前一个调用的结果,那么您可以使用
concatMap
链接它们:
Observable.create((observer: Observer<InfoMessage>) => {
doRequest("http://test1.com")
.do(response => observer.next(new InfoMessage("request1 done")))
.concatMap(() => doRequest("http://test2.com"))
.do(response => observer.next(new InfoMessage("request2")))
.concatMap(() => doRequest("http://test3.com"))
.do(response => {
observer.next(new InfoMessage("request3"));
observer.complete();
});
})
Observable.create((观察者:观察者)=>{
多勒奎斯特(”http://test1.com")
.do(response=>observer.next(newinfomessage(“request1 done”))
.concatMap(()=>doRequest(“http://test2.com"))
.do(response=>observer.next(新的InfoMessage(“request2”))
.concatMap(()=>doRequest(“http://test3.com"))
.do(响应=>{
observer.next(新信息消息(“request3”);
observer.complete();
});
})
不要忘记,您需要返回可观察的
。从您的函数创建,然后订阅它。如果每个HTTP调用都独立于上一次调用的结果,您可以将它们与concatMap
链接:
Observable.create((observer: Observer<InfoMessage>) => {
doRequest("http://test1.com")
.do(response => observer.next(new InfoMessage("request1 done")))
.concatMap(() => doRequest("http://test2.com"))
.do(response => observer.next(new InfoMessage("request2")))
.concatMap(() => doRequest("http://test3.com"))
.do(response => {
observer.next(new InfoMessage("request3"));
observer.complete();
});
})
Observable.create((观察者:观察者)=>{
多勒奎斯特(”http://test1.com")
.do(response=>observer.next(newinfomessage(“request1 done”))
.concatMap(()=>doRequest(“http://test2.com"))
.do(response=>observer.next(新的InfoMessage(“request2”))
.concatMap(()=>doRequest(“http://test3.com"))
.do(响应=>{
observer.next(新信息消息(“request3”);
observer.complete();
});
})
别忘了你需要返回可观察的。从你的函数中创建并订阅它。既然你的doRequest()
已经返回了一个可观察的,你为什么不尝试将所有的请求合并成一个流呢?您可以使用forkJoin进行以下操作:
doAllRequests() : Observable<InfoMessage> {
return forkJoin(
doRequest("http://test1.com"),
doRequest("http://test2.com"),
doRequest("http://test3.com")
).pipe(
mergeMap((responsesArray: any[]) => from(responsesArray)),
map((response: any) => new InfoMessage(response))
);
}
this.doAllRequests().subscribe();
doAllRequests():可观察{
返回叉连接(
多勒奎斯特(”http://test1.com"),
多勒奎斯特(”http://test2.com"),
多勒奎斯特(”http://test3.com")
).烟斗(
合并映射((responsesArray:any[])=>from(responsesArray)),
map((响应:any)=>newinfomessage(响应))
);
}
this.doAllRequests().subscribe();
既然您的doRequest()
已经返回了一个可观察的,为什么不尝试将所有请求合并到一个流中?您可以使用forkJoin进行以下操作:
doAllRequests() : Observable<InfoMessage> {
return forkJoin(
doRequest("http://test1.com"),
doRequest("http://test2.com"),
doRequest("http://test3.com")
).pipe(
mergeMap((responsesArray: any[]) => from(responsesArray)),
map((response: any) => new InfoMessage(response))
);
}
this.doAllRequests().subscribe();
doAllRequests():可观察{
返回叉连接(
多勒奎斯特(”http://test1.com"),
多勒奎斯特(”http://test2.com"),
多勒奎斯特(”http://test3.com")
).烟斗(
合并映射((responsesArray:any[])=>from(responsesArray)),
map((响应:any)=>newinfomessage(响应))
);
}
this.doAllRequests().subscribe();
因此,您希望在观察者完成后立即在观察者中接收每个响应,然后启动下一个http调用。@martin yessir。因此,您希望在观察者完成后立即在观察者中接收每个响应,然后启动下一个http调用。@martin yessir。我正在尝试并让您知道。提前谢谢。“return”确实应该出现在我的示例中。在尝试后更新了我的问题是的,这是真的,你需要订阅,但这并不重要,因为对Observable.create的回调只有在订阅了这个Observable之后才会调用。我正在尝试并让你知道。提前谢谢。“return”确实应该出现在我的示例中。在尝试之后更新了我的问题是的,这是真的,你需要订阅,但这并不重要,因为对Observable.create
的回调只有在订阅了这个Observable之后才调用。我非常喜欢这段代码的外观。谢谢你的回答,我明天就要尝试这个了。我用rxjs的最新版本和pipeable操作符编写了代码,但是我相信你可以在当前版本中找到如何编写它的方法。不要忘记,为了让forkJoin操作符发出,您传递给forkJoin的所有观察都必须完成(因为这是请求,我假设它们都已完成)。请尝试并使用它。谢谢。我真的很喜欢这个代码的外观。谢谢你的回答,我明天会试试这个。我用l写的代码