当前位置: 代码迷 >> JavaScript >> 使用 Observable 同步执行动态数量的 https
  详细解决方案

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

热度:93   发布时间:2023-06-05 09:31:36.0

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

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

  相关解决方案