Javascript forEach循环内的异步API调用

Javascript forEach循环内的异步API调用,javascript,node.js,asynchronous,async-await,es6-promise,Javascript,Node.js,Asynchronous,Async Await,Es6 Promise,我遇到了一个似乎无法解决的问题,我猜我在异步行为方面遗漏了一些要点 任务相对简单:需要将装有不同货币的钱包转换为单一货币。我想从以下API获取汇率: ${from}{${to}&compact=y ${from}是起始货币,${to}是目标货币 我将不同的货币存储在一个名为positions的对象中,如下所示: [ {'currency': "EUR", "amount": 10}, {'currency': "CNY", "amount": 100}, ]

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

任务相对简单:需要将装有不同货币的钱包转换为单一货币。我想从以下API获取汇率:

${from}{${to}&compact=y

${from}是起始货币,${to}是目标货币

我将不同的货币存储在一个名为positions的对象中,如下所示:

[
    {'currency': "EUR",
    "amount": 10},
    {'currency': "CNY",
    "amount": 100},
  ]
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)
因此,我们的任务是将100欧元和100人民币兑换成美元

为了收集汇率,我想在以下函数中遍历单个头寸:

    collectExRates(targetCurrency) {
    let exRatesDict = {}
    this.positions.forEach( (position) => { 
      exRatesDict[position.currency] = this.parseUrl(position.currency, targetCurrency)
    });
    return exRatesDict
}
而parseUrl是:

    parseUrl(from, to) {
    const exRateName = from + '_' + to;
    var rate;
    return fetchUrl(`https://free.currencyconverterapi.com/api/v5/convert?q=${from}_${to}&compact=y`, function(error, meta, body){
            rate = JSON.parse(body)[exRateName].val
            console.log("RATE", rate)
            return rate
        });
}
我已经尝试了一些事情(比如创建一个异步forEach、Promises、async wait等等),但是我无法得到预期的结果,即返回将货币映射到其各自汇率的汇率字典


我将非常感谢您的帮助。

问题是异步方法返回承诺,您需要等待它们的解决。执行此操作的常见模式如下:

Promise.all(arr.map(v => someAsyncFunc(v))).then((resolvedValues) => {
  resolvedValues.forEach((value) => {
    // Do your stuff here
  });
});

因此,基本上你是在初始化一堆异步调用,等待它们用Promise来解析。所有的,只有在这之后才能对解析的数据执行一些操作。

问题是异步方法返回Promise,你需要等待它们来解析。执行此操作的常见模式如下:

Promise.all(arr.map(v => someAsyncFunc(v))).then((resolvedValues) => {
  resolvedValues.forEach((value) => {
    // Do your stuff here
  });
});

因此,基本上,您正在初始化一堆异步调用,等待它们通过
承诺进行解析。所有
,只有在这之后,才能对解析的数据执行一些操作。

您应该尝试以下操作:

[
    {'currency': "EUR",
    "amount": 10},
    {'currency': "CNY",
    "amount": 100},
  ]
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)

您应该尝试以下方法:

[
    {'currency': "EUR",
    "amount": 10},
    {'currency': "CNY",
    "amount": 100},
  ]
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)