我在for循环中有一个rest.get请求,即发送大约20个查询(基于来自先前请求的数据,每次更改查询)。我的问题是它似乎完全运行了for循环,然后查询以异步方式运行并且正在响应返回最快而不是连续的数据。如果我在.end函数中调用forloop的index.log,那么在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列表相匹配。我是节点新手,所以我可能做错了。任何帮助将不胜感激!
答案 0 :(得分:1)
您在for循环中执行restful响应。相反,考虑构建一个完整的JSON对象,其中填充了客户端需要的所有数据(换句话说,将它们全部发送为1个大响应,而不是大量的响应)。
使用for循环构建JSON,然后在循环之外,执行1次宁静响应。
通过这种方式,您不必担心数据无序传输,并且响应已完成,并且不会丢失索引等重要信息。
答案 1 :(得分:1)
您可以使用索引变量来定位存储响应的位置。为此,您必须确保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.
}
之后使用此条件:
ImportError: No module named _tkinter, please install the python-tk package