承诺嵌套循环的问题

时间:2018-04-09 18:18:59

标签: node.js promise

我正在尝试在节点中编写服务器,并且我从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响应不包含正确的状态,实际上似乎没有一个更新。

我非常感谢任何帮助,提前谢谢!

0 个答案:

没有答案