循环获取外部 api。 prev 不可迭代

Posted

技术标签:

【中文标题】循环获取外部 api。 prev 不可迭代【英文标题】:Fetch external api in a loop. prev is not iterable 【发布时间】:2022-01-12 23:16:48 【问题描述】:

所以我正在尝试制作一个股票投资组合应用程序,并且我正处于尝试从每个订单中获取利润/损失的阶段。

我有一个循环,我在其中循环用户订单并将订单代码符号设置为股票 API url。从股票 api 得到结果后,我得到了股票的最新收盘价,也就是今天的日期。我将当前收盘价指定为 currentPrice,并设置了一个新状态,其中也列出了 currentPrice。

我收到以下错误:

error response 1 "Prev is not iterable" 这来自 setOrders 状态 它循环了太多次。我只是希望它循环订单数组的长度,应该是 4 有时我会返回信息,例如 TSLA 当前价格是 xxx 和日期 xxx,但它非常随机

这是我的代码。

const StockFetcher = (orderList, setOrders) => 

    //should do 4 cycles
    for(var i in orderList)
        if(orderList.length !== 0)
            //filter through orderList
            const ticker = orderList[i]['ticker']
            const price = orderList[i]['price']
            const amount = orderList[i]['amount']
            const date = orderList[i]['date']

            //fetch current order data
            axios.get(`$STOCK_API&symbol=$ticker&apikey=$TOKEN`)
            .then(response => 
                const foo = JSON.stringify(response)

                if(response)
                    console.log("Response data: " + response.data)
                    const data = response.data
                    //var time = new Date().toISOString().slice(0, 10)
                    //const time = 2021-12-07
                    const todayDate = data['Time Series (Daily)']['2021-12-05']['4. close']

                    if(todayDate)
                        const currentPrice = todayDate

                        console.log(ticker + " Current price: " + currentPrice)

                        const stockInfo = 
                            ticker,
                            price,
                            amount,
                            date,
                            currentPrice
                        
                        setOrders(prev =>[...prev, stockInfo])

                    


                
                else
                    console.log("This symbol does not exist in the api")
                
            ).catch(e =>
                console.log("Something went wrong with StockFetcher" + e)
            )
         else
            console.log("There are no orderList to fetch :/")
            break;
        

    
  


export default StockFetcher

我正在另一个文件上调用此代码。

这是我从 api 调用中得到的 json:


    "Meta Data": 
        "1. Information": "Daily Prices (open, high, low, close) and Volumes",
        "2. Symbol": "MSFT",
        "3. Last Refreshed": "2021-12-07 16:00:01",
        "4. Output Size": "Compact",
        "5. Time Zone": "US/Eastern"
    ,
    "Time Series (Daily)": 
        "2021-12-07": 
            "1. open": "331.6400",
            "2. high": "335.8000",
            "3. low": "330.1000",
            "4. close": "334.9200",
            "5. volume": "30718746"
        ,
        "2021-12-06": 
            "1. open": "323.9500",
            "2. high": "327.4500",
            "3. low": "319.2300",
            "4. close": "326.1900",
            "5. volume": "30032556"
        ,
        "2021-12-03": 
            "1. open": "331.9900",
            "2. high": "332.7000",
            "3. low": "318.0300",
            "4. close": "323.0100",
            "5. volume": "41779279"
        ,

【问题讨论】:

【参考方案1】:

如https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Statements/for...in 中所述,不要使用 for...in 语句,而是使用 array.forEach 或 oldschool for 循环。 您还应该将订单的初始值设置为空数组,以便您可以将 prev 用作可迭代对象。

【讨论】:

谢谢,但我需要 orderList 在其中包含项目,以便我可以遍历它。所以我需要将带有 currentPrice 的新数据放入一个完全独立的状态,对吗?关于如何提高性能或清理代码的任何提示?这对我来说似乎很乱,但我想不出别的。也许只是将代码分成更小的函数? 您是否尝试为每个订单列表项设置状态?似乎您正在为每个订单列表项目获取,但从已获取项目的今天属性更新订单状态 是的,我想从 for 循环中获取股票的当前价格,然后将 currenPrice 值添加到股票中 所以您只需要使用订单列表中的最后一项,无需遍历所有项 我想遍历它们以获得所有它们的价格变化。这就是我想要做的:imgur.com/a/Kwd5vSL

以上是关于循环获取外部 api。 prev 不可迭代的主要内容,如果未能解决你的问题,请参考以下文章

Vue。如何在循环 v-for 中获取 prev 和 current 值以进行比较?

试图运行for循环,被告知'float'对象不可迭代

使用外部 API 调用和 findOneAndUpdate 循环结果

不使用循环从可迭代对象中获取值

转到基于范围的 for 循环中的下一个迭代器

集合并发修改异常-增强for循环,或者迭代器遍历的时候不可修改值