Javascript 使用Observable同步执行动态数量的https

Javascript 使用Observable同步执行动态数量的https,javascript,angular,rxjs,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... /

我有一个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);
    });
});

您可以使用
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),
  );
}

constURL=['http://www.us.someurl.com', 'http://www.hk.anotherurl.com'];
// ...
公共响应()
{
从(URL)返回。管道(
concatMap(url=>this.http.get(url)),
过滤器({isReady})=>isReady),
以(1)为例,
);
}

尝试将.json文件进一步设置为{“body”:{“ready”:false},但是无论何时何地修改.ts文件中的“ready”属性,都会出现编译错误。看见