【问题标题】:How can I make a request followed by an array of requests from that response?我怎样才能发出一个请求,然后是来自该响应的一系列请求?
【发布时间】:2019-09-02 19:29:37
【问题描述】:

我正在向服务器发出请求以获取项目列表。

为简单起见,假设第一个 API 请求返回一个口袋妖怪列表。

getPokemon()

"objects" :[
 { "name": "Bulbasaur", "id": "1234"}, 
 { "name": "Squirtle", "id": "4321" },
 ...
]

我需要做的是,对于每个返回的口袋妖怪,我需要使用 id 单独请求有关口袋妖怪的更多详细信息。

getPokemonDetails(id: "1234")

"data" : { 
   "age": "12", 
   "height": "2 feet", 
    ... }

图片我正在尝试列出所有口袋妖怪的高度。在发出父 getPokemon 请求后,我需要每个单独请求的详细信息。

每个请求都返回一个承诺。

我尝试过但不起作用的方法:

this.provider.getPokemon().then(results => {
   foreach pokemon in results {
       this.provider.getPokemonDetails(pokemon.id).then(detail => {
           myData.push(detail.height)
       })
   }
})

看来这个时间安排有问题。

如何在 Ionic 3 中做到这一点?

我似乎突然想到了一些东西:forkJoin, map, mergeMap...我在寻找什么?

【问题讨论】:

  • 请澄清:您的 API 请求实际上是设置为承诺还是可观察的?您的示例似乎暗示了承诺,但您询问了特定于可观察对象的方法。
  • @miqh 它们被设置为承诺。很抱歉!

标签: angular typescript ionic-framework ionic3


【解决方案1】:

试试这个:

this.provider.getPokemon().then(results => {
     results.map(pokemon => {
         this.provider.getPokemonDetails(pokemon.id).then(detail => {
              myData.push(detail.height);
         });
     });
});

【讨论】:

    【解决方案2】:

    您可以使用 forkJoin 组合多个 http 发送的请求。让我举个例子:

    this.provider.getPokemon().flatMap(results => {
       const ids = results.objects.map(result => result.id)
       const observables = ids.forEach(id => this.provider.getPokemonDetails(id))
       return forkJoin(observables)
    }).subscribe(result => console.log(result);
    

    Stackblitz with similar use case this also contains promise example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-09
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多