【问题标题】:Retrieve the status from multiple axios requests called from multiple components从多个组件调用的多个 axios 请求中检索状态
【发布时间】:2020-01-24 22:03:10
【问题描述】:

我的应用程序中有一个仪表板。在这个仪表板中,我让用户放置了许多小部件(每个小部件都是一个类组件)。每个小部件呈现不同的内容,例如图表、图像和文本。当我显示它时,每个小部件都会进行 axios 调用以从后端检索数据。我需要一种能够判断所有请求何时完成的方法,以便我可以完全呈现​​ HTML(稍后我将使用 HiqPdf 导出它)。

我需要每个小部件都是独立的,以便我可以在其他组件中使用。这就是为什么每个小部件都进行自己的 axios 调用的原因。否则,我认为我可以在我的小部件上方的单个组件中进行许多 axios 调用,然后我会将所有数据作为道具传递给每个小部件。但是,不... axios 调用必须保留在每个小部件中。 我发现很多地方都在谈论 Promise,但每个示例都展示了如何在单个组件中完成它。

我正在研究它的原因是因为我需要使用一个名为 HiqPdf 的库来导出它。该库接收 HTML 作为字符串并导出为 PDF。因此,我需要知道仪表板何时已完全加载,以便应用程序将其导出。

【问题讨论】:

  • 用户创建仪表板时是实时的吗?例如,您是否有一个带有“保存”按钮的“编辑仪表板”视图,还是在添加小部件时立即一次性执行请求?
  • 两种情况我都有。用户可以编辑或仅显示仪表板。但是,它是相同的组件。不同之处在于,在编辑模式下,用户可以放置新的小部件,或者将它们放在其他位置。因此,在这两种情况下,我都会调用 axios。

标签: javascript reactjs axios


【解决方案1】:

考虑一个事件驱动的框架,它可以保持单页应用的全局状态,并在状态发生变化时通知订阅者。

著名的框架之一是

另一个简单的框架是。这些是利用 的一些类似问题:

对于您的情况,可能是这样的:

const all_calls = [];
const {on, one, fire, unsub} = mufa;

axios.get('call1').then((data) => {

   fire('call1_received', data);
})


axios.get('call2').then((data) => {

   fire('call2_received', data);
});


one('call1_received', () => {
  all_calls.push('call1_received');
  if (all_calls.length === 2) {
     alert('!!!! All calls have been received')
  }

})

one('call2_received', () => {
  all_calls.push('call2_received');
  if (all_calls.length === 2) {
     alert('!!!! All calls have been received')
  }

})

注意,one 将只订阅一次.. 而on 将永远订阅。

【讨论】:

  • 如果我不知道我将有多少个 axios 调用怎么办?由于在我的仪表板中,用户可以根据需要添加任意数量的小部件,所以我需要先计算一下,对吧?
  • 请看看这种方法是否是一个好习惯。如果我计算仪表板中的小部件数量并将其存储在 redux 中会怎样?这将是我开始导出过程时要做的第一件事。存储它之后,我会进行处理,每个小部件在完成其请求后会在 redux 中增加一个 int 变量。最后,当小部件的数量等于 int 变量时,我启用了 Export 选项。
  • @ArthurMedeiros 计数不是一个好方法,除非你有一个可以管理数据的构造函数。假设您有 5 个承诺,然后在这些承诺尚未解决的情况下编辑一个小部件。现在您有 6 个不同的异步调用。无论哪个先完成,即使不正确,也会传播。
猜你喜欢
  • 2016-11-26
  • 1970-01-01
  • 2019-01-12
  • 2021-11-23
  • 2011-08-30
  • 2019-06-24
  • 2016-01-15
  • 2020-10-07
  • 2019-05-06
相关资源
最近更新 更多