我有一个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);
});
});
答案 0 :(得分:0)
您可以使用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),
);
}