【问题标题】:How do I match a response to a request if there are multiple requests made with promises?如果有多个使用承诺的请求,我如何匹配对请求的响应?
【发布时间】:2017-10-07 13:09:48
【问题描述】:

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

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

这是一个响应的样子:

{
    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 中的axios.all() 是什么?
  • 我不明白为什么许多人过着艰难的生活并尝试在列表中使用承诺。更好地使用async 它更容易,代码更具可读性。试试async.mapcaolan.github.io/async/docs.html#map
  • @FrankRoth 那会更容易吗?你仍然有一个集合,你仍然有iteratee,你仍然有一个结果处理程序。您仍然需要本质上相同的代码,只是以不同的方式调用它。而async.map 甚至不使用承诺,你好回调地狱......

标签: javascript ajax promise axios


【解决方案1】:

我会用无承诺的方法来做这件事。 http.get 只是一个伪实现:

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

不确定回调地狱在哪里。

【讨论】:

    【解决方案2】:

    axios 依赖于原生 ES6 Promise 实现

    (source)

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

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

    (MDN: Promise.all)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-09
      • 2014-05-30
      • 2023-03-16
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 2019-10-30
      • 2019-09-17
      相关资源
      最近更新 更多