我遇到了一个似乎无法解决的问题,我猜想我在异步行为方面缺少一些要点。
任务相对简单:需要将具有不同货币的钱夹转换为单一货币。我想从以下API获取汇率:
https://free.currencyconverterapi.com/api/v5/convert?q= $ {from} _ $ {to}&compact = y
以$ {from}为起始货币,$ {to}为目标货币。
我将不同的货币存储在一个名为positions的对象中,如下所示:
jq '.Records |= map(select(.prefix == "Z99438").prefix |= . + "_")' file
因此,任务是将100EUR和100CNY转换为美元。
要收集汇率,我要遍历以下函数中的单个位置:
[
{'currency': "EUR",
"amount": 10},
{'currency': "CNY",
"amount": 100},
]
并且使用parseUrl:
collectExRates(targetCurrency) {
let exRatesDict = {}
this.positions.forEach( (position) => {
exRatesDict[position.currency] = this.parseUrl(position.currency, targetCurrency)
});
return exRatesDict
}
我已经尝试了几件事(例如创建异步forEach,Promises,异步等待等),但我只是无法获得预期的结果,即返回将货币映射到其各自货币的汇率字典。汇率。
非常感谢您的帮助。
答案 0 :(得分:3)
问题是异步方法返回Promise,您需要等待它们解决。接下来的常见模式是
Promise.all(arr.map(v => someAsyncFunc(v))).then((resolvedValues) => {
resolvedValues.forEach((value) => {
// Do your stuff here
});
});
因此,基本上,您是在初始化一堆异步调用,等待它们使用Promise.all
解析,然后再对已解析的数据执行一些操作。
答案 1 :(得分:1)
您应该尝试这样的事情:
function fetchUrls(urlList) {
let promises = [];
for(idx in urlList) {
promises.push(fetch(urlList[idx]));
}
return Promise.all(promises);
}
fetchUrls(your_list_of_urls)
.then(console.log)