【问题标题】:Array list is shown, array length is 0 and elements are undefined in react显示数组列表,数组长度为 0 并且元素在反应中未定义
【发布时间】:2021-08-17 15:12:33
【问题描述】:

所以,基本上我在两个不同的函数中有两个 api 调用,它们是从单个组件页面调用的。 await 函数应用于它们中的每一个,因为从第一个 api 提供的每个响应都用作第二个 api 的参数。对于第一个 api 调用,在函数内部,响应被推送到名为 all_countries 的数组中。

const apiCall = getCountry(req)
      .then((response) => {
        all_countries.push(...response);
        dispatch(actionSuccess(NICE_ONE, response));
      })
      .catch((error) => {
        dispatch(actionFailure(NICE_ONE, error));
      });

all_countries 中的每个数组对象都将被映射,并且值(即来自 all_countries 的每个对象中存在的国家代码)用于调用另一个 api 以获取响应,但我的问题是控制台从第二个函数记录 all_countries ,它显示了空数组的符号。打开数组后,它会列出所有国家/地区。当我控制台记录数组的长度时,它显示 0,而在控制台记录 all_countries [0] 等元素时,它显示未定义。为什么会这样?有人可以帮帮我吗? This gets shown on console

展开后,如下所示: enter image description here

所以,我发现在添加 all_countries.push 时,intellij 向我显示警告,响应不是数组类型,而是 AllCountryRes 类型。

AllRelaysRes 类型定义为:

export type AllRelaysRes = {
  logo: string;
  ipv4: string;
  ipv6: string;
  port: string;
  location: {
    id: number;
    ip: string
  };
};

getCountry 函数是这样的:

export const getCountry = (url: string): Promise<AllRelaysRes> => {
  ExternalApi.setBaseUrl(url);
  return ExternalApi.apiCall<AllRelaysRes>({
    method: "GET",
    url: "something",
  });
};

来自 api 的响应是一个对象数组。我只是打字稿的初学者并尝试了一些东西。我的问题是如何将响应类型设为对象 AllRelayRes 的数组?不返回 ExternalApi.apiCall 尖括号 AllRelayRes 意味着预期的响应是 AllRelayRes 数组,因为 AllRelayRes 保留在尖括号内?我该如何解决?这是我得到数组长度为 0 的真正问题吗?

【问题讨论】:

  • 我们能看到你说的console.log吗?听起来像是在返回一个对象,而不是数组?
  • 我已将屏幕截图添加到问题中。
  • 你能给我们一个codeandbox来互动吗?
  • 对不起,我不能。如果可以的话,我已经发布了代码,但我想我发现了问题所在。在将数据推送到 all_countries 时,它说“响应”不是数组类型。我正在想办法将响应类型声明为对象数组。
  • 如果有帮助,我添加了代码。

标签: javascript arrays reactjs promise


【解决方案1】:

我相信您正在处理AllRelayRes 类型的对象集合,而不是数组。它在控制台中显示为[],但这代表了一个集合。

如果要将其用作数组,请在函数&lt;AllRelaysRes[]&gt;中指定类型

export const getCountry = (url: string): Promise<AllRelaysRes[]> => {
  ExternalApi.setBaseUrl(url);
  return ExternalApi.apiCall<AllRelaysRes[]>({
    method: "GET",
    url: "something",
  });
};

那么你应该能够以数组格式操作数据

如果你想把它保存为一个集合,你可能可以遍历它们

let x, key, obj
for(x in AllRelayRes) {
    key = x; // 0, 1, 2 .. the index
    obj = AllRelayRex[x] // the object
    // country_name = AllRelayRex[x].country_name, etc
}

【讨论】:

  • 非常感谢。我能问你一件事吗?来自上述数据的响应包含一个代码列表,我需要每个代码作为参数来获取包含项目详细信息的其他请求。现在,我已经使用 .then 并调用了另一个函数来获取传递每个代码的详细信息。有更好的方法吗?
  • @Nothing - 抱歉,如果不更好地掌握这里的架构,很难给出建议。尝试您的想法,如果遇到性能问题,请提出另一个问题。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2020-10-12
  • 2018-12-02
  • 2019-01-13
  • 2016-03-14
  • 2020-12-22
  • 2012-10-29
  • 1970-01-01
相关资源
最近更新 更多