使用Observable

时间:2019-02-21 07:54:17

标签: javascript angular rxjs

我有一个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 个答案:

答案 0 :(得分:0)

您可以使用concatMapfiltertake的组合来实现:

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),
  );
}

DEMO