使用React Native Fetch中的对象响应时未处理的Promise Rejection

时间:2018-03-03 03:09:19

标签: api react-native promise fetch

我目前正在使用他们的Official API

在React Native中构建一个黑客新闻阅读客户端

我想展示当天的头条新闻。首先,我获得当天热门帖子的ID,然后使用这些id来获取故事。

但是当我执行此操作时,承诺会被ids.map is undefined拒绝。

我该如何解决这个问题?

FeedScreen.js

import { getTopStoriesID, getStoriesByID } from '../../hacknews-api';

class FeedScreen extends Component {
  constructor(props) {
    super(props);

    this.state = {
      loaded: false,
      stories: [],
    };
  }

  async componentDidMount() {
    const storiesID = await getTopStoriesID();
    const stories = await getStoriesByID(storiesID[10]);

    this.setState({ stories });
  }

  render() {
    return <Text>{this.state.stories}</Text>;
  }
}

export default FeedScreen;

hacknews-api.js

const BASE_URL = 'https://hacker-news.firebaseio.com/v0';

export const getTopStoriesID = async () => {
  const res = await fetch(BASE_URL + '/topstories.json');
  const storiesID = await res.json();

  return storiesID;
};

export const getStoriesByID = async (ids) => {
  const res = await Promise.all(ids.map(async (id) => {
    const res = await fetch(BASE_URL + `/item/{id}.json`)
    const story = await res.json();

    return story;
  }));

  const stories = await res.json();
  return stories;
}

1 个答案:

答案 0 :(得分:1)

您可以在数组上使用Array.prototype.map()而不是对象。

  

map()方法创建一个新数组,其中包含调用a的结果   为调用数组中的每个元素提供了函数。

示例

export const getStoriesByID = async (ids) => {
  // check if the argument is defined and its an Array
  if(ids && ids.constructor === Array) {
    // do something with array of ids, for example do a map()
  } else {
    // do something otherwise
  }
}