【问题标题】:For each Request from an array Node.js对于来自数组 Node.js 的每个请求
【发布时间】:2017-12-23 17:01:33
【问题描述】:

我有这个示例数组

[{
  "car": "Toyota",
  "ID": "1",
  "Doors": "4",
  "price": "0"
}, {
  "car": "Chevrolet",
  "ID": "2",
  "Doors": "2",
  "price": "0"
}, {
  "car": "Dodge",
  "ID": "3",
  "Doors": "2",
  "price": "0"
}]

如何对数组中的所有ID进行请求,所有IDs的结果返回数组价格。

request(
  'http://steamcommunity.com/market/priceoverview/?currency=1&appid=730&market_hash_name='+ID,
  function (e, r, body){
    var req_data = JSON.parse(body);
  }
)

谢谢!

【问题讨论】:

    标签: javascript arrays node.js for-loop asynchronous


    【解决方案1】:

    您可以使用any of the interface wrappers recommended by requestPromise.all()。例如,使用native promises 并关注this example

    const request = require('request-promise-native')
    
    Promise.all(array.map(({ ID }) => request({
      uri: `http://steamcommunity.com/market/priceoverview/?currency=1&appid=730&market_hash_name=${ID}`,
      json: true
    })).then(data => {
      // each of the response objects in the same order as initial array
      data.forEach(objRes => console.log(objRes))
    }).catch(error => {
      // handle the first rejected error here
    })
    

    【讨论】:

    • 很干净,但我很好奇,请求的顺序是否保持?我会假设 async 不会提供这种保证,是同步调用 promise-native 还是重新排序结果以保持顺序?
    • @JasonSperske 请参阅我为Promise.all() 链接的文档。它确实保持相同的顺序,as per the specification
    • 这个答案的一个有趣的副作用是,如果所有请求都成功完成,您将只获得最终结果集合,如果这是您正在寻找的行为,那么这是最好的答案。
    • @JasonSperske 我在示例中添加了该用法。另外,如果您没有看到我在上面的评论中链接了 Promise.all() 的顺序保留在规范中。
    • 我已经投了赞成票 :) 我只是指出,如果发生任何错误(例如其中一个 HTTP 请求失败)将导致 Promise.all 跳转到错误回调(可能是正是 OP 正在寻找的)
    【解决方案2】:

    您可以使用async.map 来执行此操作。使用您的代码作为起点,它可能看起来像这样(我将 URL 更改为我知道响应 JSON 的站点):

    var request = require('request');
    var async = require('async');
    var data = [{
                  "car": "Toyota",
                  "ID": "1",
                  "Doors": "4",
                  "price": "0"
                }, {
                  "car": "Chevrolet",
                  "ID": "2",
                  "Doors": "2",
                  "price": "0"
                }, {
                  "car": "Dodge",
                  "ID": "3",
                  "Doors": "2",
                  "price": "0"
                }];
    
    async.map(data , function(item, callback) {
      request("https://randomvictory.com/random.json?id="+item.ID,
               function(error, response, body) {
                 if(!error) {
                   //having checked there was no error, you pass 
                   //the result of `JSON.parse(body)` as the second
                   //callback argument so async.map can collect the
                   //results
                   callback(null, JSON.parse(body));
                 }
               });
    }, function(err, results) {
      //results is an array of all of the completed requests (note
      //that the order may be different than when you kicked off
      //the async.map function)
      console.log(err, results);
    });
    

    【讨论】:

    • 希望那些投机取巧的人能解释为什么,如果有甚至是一个原因......
    • 我同意,但至少如果它有助于@matias 得到他的答案,我愿意忍受它:)
    猜你喜欢
    • 2016-06-28
    • 2023-04-02
    • 1970-01-01
    • 2016-11-18
    • 2021-04-04
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多