2017-05-09 23 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); 

不確定回調地獄在哪裏。