如何从多个URL获取数据并将其保存在数组中(本机反应)

时间:2017-11-08 21:09:12

标签: javascript react-native

我有一系列RSS网址,我想从中获取数据并将数据保存在一个数组中。这是我的代码:

// rss urls array
var URLS = [
  "https://www.wired.com/feed/rss",
  "http://feeds.bbci.co.uk/news/rss.xml",
  "http://www.nasa.gov/rss/dyn/breaking_news.rss"
];

我的状态中有一个数据变量,我希望数据存储

constructor() {
    super()
    this.state = {
      data: []
    }
  }

我使用fetchData()函数尝试获取数据

  fetchData() {
    var urlArray = [];

    for (var i = 0; i < URLS.length; i++) {
      urlArray.push(URLS[i]);
    }

    fetch(urlArray)
      .then((response) => response.text())
      .then((responseData) => {
        this.setState({
          data: this.extractData(responseData)
        });
      }).done();
  }


  componentDidMount() {
    this.fetchData();
  }

我使用extractData函数从rss Feed获取数据,如此

  extractData(text) {
    var doc = new DOMParser().parseFromString(text, 'text/xml');
    var items_array = [];
    var items = doc.getElementsByTagName('item');

    for (var i = 0; i < items.length; i++) {
      items_array.push({
        title: items[i].getElementsByTagName('title')[0].lastChild.data,
        description: items[i].getElementsByTagName('description')[0].lastChild.data,
        //thumbnail: items[i].getElementsByTagName('enclosure')[0].getAttribute('url'),
        //link: items[i].getElementsByTagName('link')[0].textContent,
        //date: items[i].getElementsByTagName('pubDate')[0].textContent,                    
      })
    }
    return items_array;
  }

但是当我跑步时,我收到一条错误,上面写着“无法加载空网址”

2 个答案:

答案 0 :(得分:3)

您正在将数组传递给fetch()而不是字符串或Request对象。您可以使用Promise全部或async/await和一个循环来对fetch()进行多次调用,并在所有请求完成时获取结果,如果任何其他请求发生错误则记录错误。您还可以处理错误并继续循环以获取成功的请求和错误消息。

  fetchData() {    
    return Promise.all(
      URLS.map(url => 
        fetch(url)
        .then(response => response.text())
        .then(responseData => {
          this.setState({
            data: this.extractData(responseData)
          })
        })
        .catch(err => /* handle errors here */ console.error(err))
      )
    ).then(() => {// do stuff}, err => {// handle error})
  }

从问题不清楚.done()是什么或调用.done()的预期结果是什么。

答案 1 :(得分:1)

除@ guest271314答案外,将setState调用修改为

Dim currentDate As Date
currentDate = min_date
Do Until currentDate >= max_date
    currentDate = DateAdd("m", 1, currentDate) ' Adds 1 month to the date
    ' Use DateAdd("yyyy", 1, currentDate) for adding 1 year.
    MsgBox currentDate 
Loop

在您之前的代码中,每次请求完成时您都会覆盖数据数组。在上面的代码段中,您可以看到它将新响应添加到上一个数组。