【问题标题】:What's the best way to store a HTTP response in Ionic React?在 Ionic React 中存储 HTTP 响应的最佳方式是什么?
【发布时间】:2021-11-12 14:52:48
【问题描述】:

我正在使用 Ionic React 开发一个应用程序,它执行一些对 API 的 HTTP 请求。问题是我需要将请求的响应存储在本地存储中,以便在任何地方都可以访问它。我目前的做法是使用@ionic/storage:

let body = {
  username: username,
  password: password
};
sendRequest('POST', '/login', "userValid", body);
let response = await get("userValid");
if (response.success) {
  window.location.href = "/main_tabs";
} else if (!response.success) {
  alert("Incorrect password");
}
import { set } from './storage';

// Handles all API requests
export function sendRequest(type: 'GET' | 'POST', route: string, storageKey: string, body?: any) {
  let request = new XMLHttpRequest();
  let payload = JSON.stringify(body);
  let url = `http://localhost:8001${route}`;
  request.open(type, url);
  request.send(payload);

  request.onreadystatechange = () => {
    if (request.readyState === 4 && storageKey) {
      set(storageKey, request.response);
    }
  }
}

问题是当我得到userValid 键时,响应还没有回来,所以即使等待也会返回未定义。因此,我每次都必须发送另一个相同的请求,以便 Ionic 读取正确的值,这实际上是第一个请求的响应。除了每次执行请求时设置超时之外,还有其他正确的方法吗?

【问题讨论】:

  • 您的问题是 sendRequest 正在触发异步 XMLHttpRequest 请求。您正在 sendRequest 方法完成之前检查存储。您需要修改此代码以使 sendRequest 异步并在该调用中利用 await。不过,还有其他方法可以在 ionic 中利用这种类型的功能。如果有机会,我会在答案中为您提供一个示例。

标签: reactjs ionic-framework xmlhttprequest


【解决方案1】:

您正在检查设置之前的存储结果。这是因为您的 sendRequest 方法正在调用异步 XMLHttpRequest 请求,并且您在 sendRequest 方法完成之前检查存储。这可以通过使 sendRequest 异步并稍微重组代码来解决。

我建议您改为寻找使用钩子或 API 库的离子反应示例 - 例如 fetchAxios。这将使您的生活更轻松,并且您应该找到大量示例和文档。查看下面的一些参考资料以开始使用:

Example from the Ionic Blog using Hooks

Example using Fetch using React

Related Stack Overflow leveraging Axios

【讨论】:

  • 谢谢,有没有办法在将请求代码保存在单独文件中的同时做到这一点?
  • @ep742 是的,您可以将请求包含在单独的文件中。我编辑了答案以包含直接来自 Ion 博客的链接。如果您查找 API 示例,您将了解其结构。以下是文章中包含的示例 repo,也可作为示例:github.com/mlynch/ionic-react-hooks-demo
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2011-12-10
  • 2018-03-16
  • 2011-01-02
  • 2013-06-14
  • 2019-10-04
  • 1970-01-01
相关资源
最近更新 更多