Harry
Harry

Reputation: 1091

How to fetch content from an array of URLs react native

I am trying to fetch data from multiple feeds and store it in an array.

the urls:

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"
];

Array i want to populate:

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

The function to extract title and description from feeds

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,                  
      })
    }
    return items_array;
  }

The code to fetch the data:

fetchData() {
    return Promise.all(
      URLS.map(url => fetch(url)
        .then(response => response.text())
        .then(responseData => {
          this.setState(
            (prevState, props) => ({
              data: [...prevState.data, this.extractData(responseData)]
            })
          );
        })
        .catch(err => console.error(err))
      )
    ).then(() => { /* do some thing */ }, err => { console.error(err) }) 
  }

The problem is that the data is not showing up in the list but if I add test data like the code below it displays just fine: data: [...prevState.data, {title: "t1", description: "d1"}, {title: "t2", description: "d2"}]

Upvotes: 0

Views: 931

Answers (1)

Hemerson Carlin
Hemerson Carlin

Reputation: 7424

The logic seems to work just fine, however you are not using the spread operator correctly:

this.setState(
  (prevState, props) => ({
    data: [...prevState.data, ...this.extractData(responseData)]
  })
)

const data = [1,2,3,4]
const extraElements = [5,6,7,8]
const result = [...data, ...extraElements]

console.log(result)

Upvotes: 2

Related Questions