循环获取外部 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 值以进行比较?