Javascript 所有的承诺似乎都不是等着所有的承诺都兑现

Javascript 所有的承诺似乎都不是等着所有的承诺都兑现,javascript,asynchronous,es6-promise,Javascript,Asynchronous,Es6 Promise,嘿,我知道这可能在其他地方得到回答,但我找不到一个适合我需要的。此代码: async function makeCharts(coin){ let results = await Promise.all([getDailyData(coin), getCurrentData(coin)]) makeCurrentLineChart(coin, results[1]) makeHighLowLineChart(coin, results[0]) } 似乎不会等待结果数组被解析。这两种

嘿,我知道这可能在其他地方得到回答,但我找不到一个适合我需要的。此代码:

async function makeCharts(coin){
  let results = await Promise.all([getDailyData(coin), getCurrentData(coin)])
  makeCurrentLineChart(coin, results[1])
  makeHighLowLineChart(coin, results[0])
}
似乎不会等待结果数组被解析。这两种图表方法有时没有数据,有时工作得很完美

以下是异步函数:

async function getDailyData(coin){
  let response = {}
  try{
    response = await axios.get('https://www.alphavantage.co/query?function=DIGITAL_CURRENCY_DAILY&symbol='+ coin +'&market=USD&apikey=' + APIKEY)
  }catch(err){
    response = err
  }
  let obj = { labels: [], highdata: [], lowdata: [] }
  const data = response.data['Time Series (Digital Currency Daily)']
  let i = 0
  for(let key in data){
    if(i == 21) break; 
    i = i+1
    obj.labels.push(key)
    if (data.hasOwnProperty(key)){
      obj.highdata.push(parseFloat(data[key]['2a. high (USD)']))
      obj.lowdata.push(parseFloat(data[key]['3a. low (USD)']))
    }
  }
  return obj
}

async function getCurrentData(coin){
  let response = {}
  try{
    response = await axios.get('https://www.alphavantage.co/query?function=DIGITAL_CURRENCY_INTRADAY&symbol='+ coin +'&market=USD&apikey=' + APIKEY)
  }catch(err){
    response = err
  }
  let obj = { labels: [], currentdata: [] }
  const data = response.data['Time Series (Digital Currency Intraday)']
  let i = 0
  for(let key in data){
    if(i == 100) break; 
    i = i+1
    obj.labels.push(key.split(' ')[1])
    if (data.hasOwnProperty(key)){
      obj.currentdata.push(parseFloat(data[key]['1a. price (USD)']))
    }
  }
  return obj
}
我看过丹尼尔·希夫曼的《承诺》视频,这似乎符合其中的逻辑:

我还查看了此处,makeCharts函数与此处的语法匹配,就在摘要部分的上方:


该代码应该可以工作。我们需要一个具体的例子。我的猜测是,您使用的API有一个命中限制,您的命中率超过了,所以它返回500或更多。但这纯粹是猜测我同意Liam的观点代码看起来很正确这让人放心。可能很快就会更新。已通过电子邮件发送给端点的支持团队。
Promise.all()
如果任何承诺被拒绝,将立即解析,这意味着当
Promise.all()
解析为拒绝时,并非所有承诺都必须完成。您可以通过基本上再次调用
Promise.all()
来编程解决这个问题,而不必考虑被拒绝的承诺。但是,您使用的
Promise.all()
似乎毫无用处。您正在调用的两个函数都不返回承诺。通过
await
调用
axios.get()
,它们都是完全同步的,这意味着
axios.get()
调用是完全串行的,而不是并行的(即
Promise.all()
充其量是无用的)在
块中尝试
/
捕获
并将拒绝值分配给
响应
,而不是更合理/明确地处理拒绝。我没有看过
axios.get()
的文档,但它可能不会拒绝具有
data
属性的对象,这意味着您假设(
const data=…
)响应
时,data
是对象,当
axios.get()拒绝时,可能会抛出错误。