我正在尝试在节点中编写服务器,并且我从SQL数据库中获取数据,我有另一个功能,但是在这个函数中我有数据列表(thisData)。在我的服务器中,我需要查询另一台服务器(异地)以获取状态更新,根据此更新列表中的对象,然后使用JSON数据进行响应。
我已经在这方面工作了很长时间,并试图在这里找到基于其他答案的解决方案,我还没有找到一些东西。我原本试图用回调来做这件事,但现在我正在尝试用Promise.all()
我有我的对象thisData,它是一个包含三个“区域”的列表,每个区域都包含一个对象列表。
这两个代码段都位于标准http lib的标准侦听器函数中:
var server = http.createServer((request, response => {...
在这个函数中,我也有一个调用来获取数据:
getData(function(Data){
thisData = JSON.parse(data);
所有代码片段都在我的侦听器函数内的getData中。
我还有一个返回承诺来执行异步Web查询的函数:
var statusRequest = function(myArea, obj){
var url = 'https://www.example.com/data/' + obj.id + '/mode.json';
var options = {
method: 'GET',
uri: url,
strictSSL: false,
headers: {
'Authorization': config.auth_key,
'Accept': "application/json",
}
}
return new Promise((resolve, reject) => {
request(options, function (err, body, resp) {
var status = JSON.parse(resp).mode;
if (status == "success") thisData[area][obj.col].status = 0;
else if (status == "fail") thisData[area][obj.col].status = 1;
else thisData[area][obj.col].status = -1;
resolve(thisData[area][obj.col].status);
});
});
}
然后我有一个遍历区域和对象的循环,我将每个promise添加到一个列表并调用Promise.all(),然后我用更新的列表进行响应:
var promises = [];
Object.keys(thisData).forEach(function(area){
for (var col = 0; col < thisData[area].length; col++){
promises.push(statusRequest(area, thisData[area][col]));
}
});
Promise.all(promises).then( (val) => {
console.log(val);
response.end(JSON.stringify(thisData));
});
我最初遇到col == thisData [area] .length时解析所有promises的问题,所以我将实际对象(包含自己的列信息)传递给statusRequest函数,所以无论是否重要col变量发生了变化。
我遇到的问题是我的控制台打印出正确的状态,但我的JSON响应不包含正确的状态,实际上似乎没有一个更新。
我非常感谢任何帮助,提前谢谢!