В самом цикле для итерации по массиву, этот массив более конкретно представляет собой список объектов, каждый из которых содержит массив с кодами, которые мне нужно использовать для получения некоторой информации, предоставляемой внешнимAPI (Ради простоты я использую объекты-макеты):
data = [{resultOfRequest, [code1, code2, code3]}, {resultOfRequest, [code4, code5, code6]},...}
Мне нужно обойти массив данных, сделать один запрос на codeX и сохранить результат в resultOfRequest.
в последовательной парадигме, это будет примерно так:
for all items in data as work:
for all items in work as codeArray:
for all codes in codeArray as code:
work.result = request(to-api, code) //waiting here for termination
Я начал с javascript пару дней, и я прочитал, что он должен быть неблокирующим, но для этой конкретной задачи я должен сделать его синхронным и ждатьпока все объекты не будут проверены.
Моя попытка включает в себя обещания и выглядит следующим образом:
//here the map iterates over the data array
// work = {resultOfRequest, [code1,code2,code3] }
Promise.all(data.map((work, index) => {
orclass.elserec(work, 0).then((results) => {
console.log(results);
});
}))
.then(results => {
console.log("finished")
});
И так как мне нужно завершить рекурсивные вызовы, когда он достигает индекса 3, я должен сделатьэто в тобратный вызов:
// here i try to iterate through the codeX arrays, and making requests
//(where work = {resultOfRequest, [code1, code2, code3]})
elserec: function(work, i){
return request('api-url-code= work.array[i]', function(error, response, body) {
result = JSON.stringify(JSON.parse(body));
if (!error && response.statusCode == 200 && i !== 3) {
console.log(result);
work.resultOfRequest.push(result);
return orclass.elserec(work, i+1);
} else {
return result;
}
});
}
Он застревает при 3-м запросе данных [0].
Я бы предпочел использовать только обратные вызовы для этого, просто чтобы понять, какони работают так, как я никогда не использовал javascript, скорее предпочли бы использовать то, что было раньше, чем обещания, чтобы узнать ( В этом более конкретном контексте обратные вызовы в простом асинхронном контексте не являются чем-то особенным я знаю)!