Данные отправляются до завершения запросов - PullRequest
0 голосов
/ 02 декабря 2018

Я должен сделать запрос API, который затем я извлекаю из полученных данных и вставляю их в другой запрос API.Это не был мой шаблон проектирования API, но это то, что есть.

Моя проблема в том, что когда дело доходит до отправки ответа JSON, ответ отправляется до того, как все мои запросы будут завершены.Теперь я попытался с помощью счетчиков проверить, что все мои запросы были выполнены перед отправкой ответа, но он не работает.Я покажу вам, в чем проблема:

  • Итак, я делаю в общей сложности 26 запросов API (безумно верно).
  • Я прошел отладку и увидел, что мой счетчик корректно увеличивается на 26раз.

Здесь я проверяю счетчик:

if ((counter === counterSum)) {
        res.send(projects);
}

Проблема в том, что этот код работает до того, как все мои счетчики смогут «подсчитать».

Например, в этот момент, если я регистрирую счетчик, он достигает примерно 22 вместо 26. Часто я вижу журнал счетчика с тем же номером 5 раз или около того, потому что он регистрировался до того, как мой счетчик имелшанс на прирост.

Я сейчас работаю в эти часы, так что если у кого-то есть идея в области Node.js, это было бы удивительно.

Я добавлю очень упрощенный код, показывающий все этапы запроса, которые я должен пройти и где я делаю окончательную проверку журнала:

let departmentProcesses = JSON.parse('[' + processes + ']');
Object.keys(departmentProcesses).forEach(function (key) {
    console.log('The process' + departmentProcesses[key]);
    let val = departmentProcesses[key];
    let id = val.id;
    let proccessURL = //url with + id
        // Get all instances by project id
        request({url: processURL},
            function (error, response, body) {
                //Convert the XML into JSON
                parseString(response.body, function (err, result) {
                    departmentData = JSON.stringify(result);
                });
                let instanceData = (JSON.parse(departmentData)).feed.entry;
                // Pushes to an array so I can sum up all the iterations
                counters.push(instanceData.length);
                Object.keys(instanceData).forEach(function (key) {
                    let val = instanceData[key];
                    let processId = val.id[0];
                    let nextURL = //url with + id";
                        request({url: nextURL},
                            function (error, response, body) {
                                //Convert the XML into JSON
                                parseString(response.body, function (err, result) {
                                    departmentData = JSON.stringify(result);
                                });
                                let instanceData = (JSON.parse(departmentData)).feed.entry;
                                let val = instanceData[0].id[0];
                                let todoLink = //url with + id";
                                    request({url: todoLink},
                                        function (error, response, body, callback) {
                                            //Convert the XML into JSON
                                            parseString(response.body, function (err, result) {
                                                departmentData = JSON.stringify(result);
                                            });
                                            let instanceEntry = (JSON.parse(departmentData)).feed.entry;
                                            if (typeof instanceEntry !== 'undefined' && instanceEntry) {
                                                let finalLink = //url with + id";
                                                    request({url: finalLink},
                                                        function (error, response, body) {
                                                            //Convert the XML into JSON
                                                            parseString(response.body, function (err, result) {
                                                                departmentData = JSON.stringify(result);
                                                            });
                                                            let instanceEntry = (JSON.parse(departmentData)).feed.entry;
                                                            if (typeof instanceEntry !== 'undefined' && instanceEntry) {
                                                                upNext = {
                                                                    // some data
                                                                };
                                                                let data = {
                                                                    // some data
                                                                }
                                                                processInstances.push(data);
                                                                counter++;
                                                            }
                                                        });
                                            }
                                            else {
                                                upNext = 'null';
                                                let data = {
                                                    // some data
                                                }
                                                counter++;
                                            }

                                            console.log(counter);
                                            let counterSum = counters.reduce(function (a, b) {
                                                return a + b;
                                            }, 0);

                                            if ((counter === counterSum)) {
                                                res.send(projects);
                                            }
                                        });
                            });
                });
            });
    let data = {
        processName: processName,
        id: id,
        instances: processInstances
    };
    projects.push(data);
});
...