forEach循环内的异步API调用

时间:2018-10-19 15:13:11

标签: javascript node.js asynchronous async-await es6-promise

我遇到了一个似乎无法解决的问题,我猜想我在异步行为方面缺少一些要点。

任务相对简单:需要将具有不同货币的钱夹转换为单一货币。我想从以下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,异步等待等),但我只是无法获得预期的结果,即返回将货币映射到其各自货币的汇率字典。汇率。

非常感谢您的帮助。

2 个答案:

答案 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)