如何按照发送请求的顺序将获取的响应数据分配给数组

How do I assign my get response data to an array in the order I sent the request

我在 for 循环中有一个 rest.get 请求,它发送大约 20 个查询(基于每次更改查询的先前请求的数据)。我的问题是,它似乎 运行 使 for 循环完全通过,然后 运行 异步查询,并以 returns 最快而不是连续的数据响应。如果我 console.log forloop 在 .end 函数内的索引,它是未定义的,直到 forloop 完成,然后它是最终数字(即使它全部在 for 循环内)。我正在尝试按照发送请求的相同顺序保存(推送到数组)数据,因此我可以将数据与我正在打印的先前获取响应列表相匹配。有没有办法按照我发送请求而不是先到先得的顺序将我的响应数据分配给数组?

// this function is being called inside the previous query 
function carData(req, res) {

  var carNameJson = [];
  var resultToJson = [];

  //singleCars.length is defined in a previous query and is an array of car IDs
  for (var index = 0; index < singleCars.length; ++index) {
    //Grab each individual car ID and concatinate it into a Query
    var carNames = singleCars[index];
    var carQuery = "https://queryinfo";
    var finalSingleQuery = "carQuery + carNames";

    // puts the data into an array of JSON objects
    carNameJson = {
      carID: carNames
    };

    // result is a global variable assigned as an empty array
    // it list all the car IDs in a JSON format
    result.push(carNameJson);

    rest
      .get(finalSingleQuery)
      .proxy("http://proxyinfo")
      .end(function(resp) {
        resultToJson = {
          carInfo: resp.body
        };
     // resultInfo is a global variable assigned as an empty array
        resultInfo.push(resultToJson);
        return resultToJson;
      });
  }
}

这段代码一切正常,但它给我的数据顺序不对,所以我无法将汽车信息与汽车 ID 列表相匹配。我是节点的新手,所以我可能做错了。如有任何帮助,我们将不胜感激!

您正在 for 循环内执行 restful 响应。相反,考虑构建一个完整的 JSON 对象,其中填充了客户端需要的所有数据(换句话说,将其全部作为 1 个大响应发送,而不是大量的小响应)。

使用 for 循环构建 JSON,然后在循环外执行 1 次 restful 响应。

这样你就不用担心数据乱序,而且响应是完整的,不会遗漏索引等重要信息。

您可以使用索引变量来指定存储响应的位置。为此,您必须确保 index 变量是 for 主体的本地变量,您可以使用 let (而不是 var)实现:

for (let index = 0; index < singleCars.length; ++index) {

    // ...

    // store directly at the correct index:
    resultInfo[index] = resultToJson;

您可能也有兴趣知道何时获得所有结果。你可以用这个条件来做,就在分配给 resultInfo[index]:

之后
    if (resultInfo.filter(Object).length === singleCars.length) {
        // maybe call a callback here.
    }