Я должен сделать запрос 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);
});