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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用React Native Fetch中的对象响应时未处理的Promise Rejection相关的知识,希望对你有一定的参考价值。

我目前正在使用他们的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;

黑客新闻-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;
}
答案

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

map()方法创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

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
  }
}

以上是关于使用React Native Fetch中的对象响应时未处理的Promise Rejection的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jest-React Native 测试 fetch

android的React Native fetch()网络请求失败?

React-native:未定义不是对象

React Native中的网络请求

react-native中的网络相关用法.

React Native / Expo:Fetch 抛出“网络请求失败”