2017-05-09 83 views
1

我使用承诺发出多个请求,获取一系列股票的历史定价数据。如果使用承诺发出多个请求,如何匹配对请求的响应?

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

这里有一个反应是什么样子:

{ 
    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)); 
+1

什么是'axios' in'axios.all()'? – sabithpocker

+0

我无法理解,为什么很多人努力拼搏,尝试使用名单上的承诺。更好地使用'async'会更容易,代码更具可读性。试试'async.map'。 http://caolan.github.io/async/docs.html#map –

+0

@FrankRoth这会更容易吗?你仍然有一个集合,你仍然有'iteratee',并且你仍然有一个结果处理器。你仍然需要基本相同的代码,你只需要以不同的方式调用它。而'async.map'甚至不使用promise,hello callback-hell ... – str

回答

3

Axios公司依赖于本地ES6承诺实施

source

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

如果所有传入的promise都满足,Promise.all将使用来自传入promise的值的数组来完成,其顺序与iterable中定义的顺序相同。

MDN: Promise.all

0

我将与非承诺approuch做到这一点。 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); 

不确定回调地狱在哪里。