问题描述
我有一个 URL 数组,我需要按顺序执行 http.get。 并且,根据结果,继续处理数组中的下一项。
例如:
var myArray = this.myService.getUrls();
// myArray can be something like this:
// ['http://www.us.someurl.com', 'http://www.hk.anotherurl.com']
// Or...
// ['http://www.us.randomurl.com']
// Or...
// ['http://www.us.someurl.com', 'http://www.hk.notaurl.com', 'http://www.pl.someurl.com', 'http://www.in.boringurl.com]
当我对其中的每一个执行 http.get 时,我的服务器将在其数据中响应 {isReady: true} 或 {isReady: false}
我希望能够为 myArray 中的每个项目执行此操作,执行 http.get,如果该单个调用的结果是 isReady = true,则不要执行数组中的下一个 http.get。 如果 isReady = false,则移至数组中的下一个 URL。
我尝试过 flatMap,但似乎我无法绕过对 URL 进行硬编码:
var myArray = ['http://www.us.someurl.com', 'http://www.hk.anotherurl.com'];
this.http.get('http://www.us.someurl.com')
.map(res => res.json())
.flatMap(group => this.http.get('http://www.hk.anotherurl.com') )
.map(res => res.json())
.subscribe((res) => {
console.log(res);
});
});
1楼
cyr_x
0
已采纳
2019-02-21 10:39:57
您可以使用concatMap
、 filter
和take
的组合来实现它:
const URLS = ['http://www.us.someurl.com', 'http://www.hk.anotherurl.com'];
// ...
public getResponse()
{
return from(URLS).pipe(
concatMap(url => this.http.get<{ isReady: boolean }>(url)),
filter(({ isReady }) => isReady),
take(1),
);
}