Javascript 如果有多个带有承诺的请求,如何匹配对请求的响应?

Javascript 如果有多个带有承诺的请求,如何匹配对请求的响应?,javascript,ajax,promise,axios,Javascript,Ajax,Promise,Axios,我提出多个承诺请求,获取一系列股票的历史定价数据 因为响应可能不会以相同的顺序返回,所以我需要一种方法来知道哪个响应对应于哪个请求。回复返回时没有识别信息 下面是一个响应的样子: { history: { day: { date: '1996-01-02', open: 61.4063, close: 63.6719, high: 63.6875, l

我提出多个承诺请求,获取一系列股票的历史定价数据

因为响应可能不会以相同的顺序返回,所以我需要一种方法来知道哪个响应对应于哪个请求。回复返回时没有识别信息

下面是一个响应的样子:

{
    history: {
        day: {
            date: '1996-01-02', 
            open: 61.4063,
            close: 63.6719,
            high: 63.6875,
            low: 59.6406,
            volume: 10507600
        },
        ...
    }
}
这是我的要求:

var promises = [];
var symbols = ['MSFT', 'AAPL', 'GOOGL', 'FB', 'NVDA'];

symbols.forEach(function(symbol) {
  promises.push(axios.get('https://sandbox.tradier.com/v1/markets/history', {
    headers: {
      Accept: 'application/json',
      Authorization: 'Bearer ' + tradierACCESSTOKEN
    },
    params: {
      symbol: symbol,
      interval: 'daily',
      start: '2012-01-01'
    }
  }));
});

axios.all(promises)
  .then(function(responses) { 
    responses.forEach(function(response) {
      var data = response.data;
      // how do i know which response corresponds with the requested stock?
    });
  })
  .catch(error => console.log(error));
axios依赖于本机ES6 Promise实现

()

在履行的情况下,
response
包含一组单独的响应,其顺序与您将它们添加到
Promise.all中的顺序相同。这意味着
响应[0]
将始终是
'MSFT'
请求的响应

如果所有传入的承诺都实现,则Promise.all将使用传入的承诺中的一个值数组来实现,其顺序与iterable中定义的顺序相同


()

我会用不承诺的方式来做这件事。http.get只是一个pseude实现:

var request = function(symbol, cb){
    http.get('https://sandbox.tradier.com/v1/markets/history', {
        headers: { Accept: 'application/json', Authorization: 'Bearer ' + tradierACCESSTOKEN },
        params: { symbol: symbol, interval: 'daily', start: '2012-01-01' }
    }, cb);
};

var done = function(err, results){
   console.log(JSON.stringify(results));  // results => array same order as input
}

async.map(['MSFT', 'AAPL', 'GOOGL', 'FB', 'NVDA'], request, done);

不知道他妈的在哪

axios.all()
中,什么是
axios
?我不明白为什么很多人把生活变得艰难,并试图在列表中使用承诺。更好地使用
async
它更简单,代码更可读。尝试
async.map
@弗兰克罗斯,那怎么会更容易呢?您仍然有一个集合,仍然有
iteratee
,并且仍然有一个结果处理程序。您仍然需要本质上相同的代码,只是调用方式不同而已。而且
async.map
甚至不使用承诺,hello callback hell。。。