【问题标题】:How to correctly wait for fetch in a react class如何在反应类中正确等待获取
【发布时间】:2019-09-13 05:39:41
【问题描述】:

我有一个类,我必须检查是否存在要以一种 html 形式(比如超链接)或普通文本显示的项目。

我将对象作为道具。我发现很难使用 fetch 根据返回码正确识别项目是否存在

    this.props.item.map(function(item) {
          fetch(url+item)(). then (
              if(statusCode === 200)
                 //display hyperlink
                 return <a href=url+item>{item.a:item.b}</a>
              else
                 //normal text
                 return <disp>{item.a:item.b}</disp>
          )
         // But its expecting a return here!
         //return <disp>{item.a:item.b}</disp>
    })

【问题讨论】:

  • 如果您没有对返回的值做任何事情(不是您返回任何值),为什么还要使用 map - map 似乎是 错误的选择
  • 在以编程方式从您的应用程序向用户生成的 url 发送请求时要小心,这可能会导致一些安全风险。至少,如果我理解正确的话,听起来这些是用户生成的网址。
  • @JaromandaX 你推荐我用什么?
  • @PatrickRoberts ,是的,它只是对基本 url 的附加。没有xss

标签: javascript arrays reactjs object ecmascript-6


【解决方案1】:

问题是这是异步代码。

你有几个问题:

首先,(如果我假设这是一个 Array.prototype.map 函数是正确的).map 函数需要返回一些东西。 map 函数将一个数组转换为另一个相同大小的数组。

其次,更重要的是,fetch 返回一个Promise

因此,即使您将代码更改为:

this.props.item.map(function(item) {
     return fetch(url+item)(). then (
          if(statusCode === 200)
             //display hyperlink
             return <a href=url+item>{item.a:item.b}</a>
          else
             //normal text
             return <disp>{item.a:item.b}</disp>
      )         
})

您将得到的只是一系列承诺。

我建议你开始使用react-redux,我个人建议使用redux-saga

redux 和其他状态管理解决方案的基本概念是,您的 React 组件负责显示数据响应用户交互(通常通过调度 redux 操作) 只要。他们不应该负责实际获取或操作数据。这就是您的状态管理中间件(例如 redux-saga)的用途。

我不会在这里讨论它,但这应该会让你朝着正确的方向前进。

【讨论】:

  • 这个答案是正确的,但是你不需要推荐整个库来解决这个问题。一般建议是正确的,另外需要注意的是数据应该在componentDidMount() 和用户事件回调中获取,不是render() 方法。 render() 函数应该在异步获取发生时处理显示加载图标。您不需要 react-redux 或 react-saga 来执行此操作,它们只是使这种结构更容易。
  • @PatrickRoberts - 当然,这是一个公平的观点,它回答了更直接的问题。但是,将您的数据获取/业务逻辑与您的组件混合是创建一些非常混乱且难以使用的代码的可靠方法。
  • 最后一点,当一批数据被提取完成后,在所有数据加载完成后使用setState() 方法(很可能使用Promise.all() 来聚合你的promise)来指示React 组件使用处于其状态的新可用数据重新渲染自身。
  • 是的,我喜欢 react-redux 的一件事是它提供了一种将您的业务逻辑写入可用于组合组件的 HOC 的方法,从而允许逻辑可分离。但组件与异步数据源一起工作并不重要。
猜你喜欢
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 2019-01-19
  • 2020-09-16
相关资源
最近更新 更多