循环执行抓取请求

时间:2019-03-14 18:06:34

标签: javascript fetch

我正在开发一个应用程序,该应用程序会从第一个获取请求中返回ID列表。获取ID后,我必须遍历ID并获取每个项目的详细信息,然后将其显示在屏幕上。

  fetch(TOP_STORIES)
  .then(function(response){
    return response.json()
  }).then(function(storyIds){
      // storyIds is [22,33,44,55,66,77,88,99,123,213,342,45456,778,888]
      // is this the best way to fetch all the details of the story
      storyIds.forEach(function(storyId){

        let storyDetailsURL = `https://someurl/v0/item/${storyId}.json?print=pretty`

        fetch(storyDetailsURL)
        .then((response) => response.json())
        .then((story) => {
            displayStory(story)
        })
      })

  })

我的问题是循环获得结果的最佳方法?

更新:Promise.all给我一些问题:

enter image description here

更新:使用异步和等待

async function fetchTopHeadlinesAsyncAwait() {

  let response = await fetch(TOP_STORIES)
  let storyIds = await response.json()

  for(let storyId of storyIds) {
    console.log(storyId)
    let storyDetailsURL = `someurl/er/tg/${storyId}.json?print=pretty`
    let response = await fetch(storyDetailsURL)
    let story = await response.json()
    displayStory(story)
  }
}

2 个答案:

答案 0 :(得分:2)

您可以使用Promise.all功能来获取异步操作列表。一切成功后,它们便会完成。

这是Promise all的示例代码,请让我知道它的工作原理:)

[Activity(
    Label = "Configuration",
    MainLauncher = false,        
    Theme = "@style/Theme.AppCompat.Light.Dialog_Configuration",        
    ExcludeFromRecents = true
)]

public class ConfigurationView : AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        RequestWindowFeature(WindowFeatures.NoTitle);

        SetContentView(Resource.Layout.Configuration);
    }
}

答案 1 :(得分:0)

如果其中一个故事引发了错误,则此简单的try / catch可使您的异步代码不中断。在这种情况下,我将使用displayStory函数显示错误,但您可以执行任何操作。

column-count