2017-05-09 5 views
1

私は、株式の配列の過去の価格データを取得して、約束して複数のリクエストをしています。複数のリクエストが約束されている場合、リクエストに対するレスポンスをどのように一致させるのですか?

応答が同じ順番で戻ってこない場合があるため、どの応答がどの要求に対応しているかを知る方法が必要です。応答は識別情報なしで返されます。

ここに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.all()'に 'axios'とは何ですか? – sabithpocker

+0

なぜ多くの人が自分の人生を傷つけ、リストに約束を使っているのか理解できません。 'async'を使う方がはるかに簡単でコードははるかに読みやすくなります。 'async.map'を試してみてください。 http://caolan.github.io/async/docs.html#map –

+0

@FrankRothどうすれば簡単でしょうか?あなたはまだコレクションを持っていますが、あなたはまだ 'iteratee'を持っていますが、あなたはまだ結果ハンドラを持っています。本質的に同じコードを必要とするだけで、別のコードと呼ぶだけです。そして、 'async.map'は約束、hello callback-hellを使っていません... – str

答えて

3

axiosがネイティブES6約束の実装

source

に依存

フルフィルメントの場合、responseには、個別の応答の配列が、Promise.allに追加したのと同じ順序で含まれています。つまり、response[0]は常に'MSFT'の要求の応答になります。

すべての渡された約束が満たされた場合、Promise.allは、渡された約束からの値の配列で、反復可能で定義されているのと同じ順序で実行されます。

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); 

コールバック地獄はどこにあるのですか。

関連する問題