【问题标题】:Array not empty, yet Browser console show .length = 0 [React tsx - API call] [duplicate]数组不为空,但浏览器控制台显示 .length = 0 [React tsx - API 调用] [重复]
【发布时间】:2021-06-18 14:52:48
【问题描述】:

在 React 组件中,我有一个函数(在渲染组件后触发):

function getGlassesNames () {

    let outputArray:string[] = getGlassesOriginal();
    console.log(outputArray);
    console.log(typeof outputArray);
    console.log(outputArray.length);


} 

console.log #1 显示 '[]'。(您可以打开它并注意到它实际上是一个带有数据的 pobated 数组)

console.log #2 显示“对象”

但是...console.log #3 显示 '0'

内部函数“getGlassesOriginal”正在从 utils.tsx 调用,内容如下:

export function getGlassesOriginal ():string[] {
    let outputArray:string[] = [];


axios
    .get("https://www.thecocktaildb.com/api/json/v1/1/list.php?g=list")
    .then((response)=>{

        

        let responseDataJson=response.data.drinks;

        var i=0;
        for (let element in responseDataJson) {
             
            outputArray.push(responseDataJson[element].strGlass.toString());
           
        }
         
       }
            
)


return outputArray;




}

我只是不明白为什么我可以在控制台浏览器中看到 getGlassesNames 中的 outputArray 正确地使用 data (Element[index]=value) 进行了调整,但是一旦我想使用它们的值,这些值就是未定义的。

希望你能帮助我!提前谢谢!!!

【问题讨论】:

  • 更好的格式会帮助你

标签: reactjs typescript axios


【解决方案1】:

在http请求调用的then语句中携带return函数,这是异步,大​​部分时间将在函数的return行之后调用如上所述。当您的请求得到响应时,then 被调用,您的函数已经返回了一段时间。

export async function getGlassesOriginal (): Promise<string[]> {
    return await axios
        .get("https://www.thecocktaildb.com/api/json/v1/1/list.php?g=list")
        .then(response => response.json())
        .then(({ drinks }) => drinks.map(item => item.strGlass));
}

用法:

const result = await getGlassesOriginal();

【讨论】:

  • 此代码将失败,因为该函数不返回任何内容,而是定义为返回字符串数组。
  • 我还没有编写函数,它来自问题。我所做的编辑是为了显示等待异步进程的正确用法。
  • 这不是这里要问的。人们需要了解的是异步进程的使用以及它们的行为方式,而不是应该如何从 TypeScript 函数返回正确的类型。
  • 但是在您的previous revision 中,您没有在axios 之前包含return 关键字,因此它没有从getGlassesOriginal 函数返回任何内容。现在您已经编辑了答案,它不会失败。它仍然是一个封闭问题的答案,所以 OP 可能不会回来奖励你;重复的问题显示了如何在编辑后准确地执行您现在的答案。
  • 是的,你说得对。但似乎不公平的是,downvoters 的投票没有版本化,就像一个答案可以这样做:)。无论如何,即使我第一次做对了,原始帖子中的代码也无法正常工作,并且它会抛出 TypeError,因为它正在从 undefiend 道具中检索道具,我已经检查了服务器响应。
猜你喜欢
  • 2023-04-02
  • 2015-07-18
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2020-04-16
  • 2014-05-12
  • 1970-01-01
相关资源
最近更新 更多