Чем заменить setTimeout?
Имеется rest запрос в цикле и ожидание setTimeout. В примере установлен таймаут в 1000мс, хотелось бы уменьшить это время, так как количество итераций может быть большим. Если установить таймаут меньше (200, 100мс), бывает не успевает вытянуть значение из ответа, запинается, появляются ошибки, использую Postman. Есть ли способ ожидания выполнения запроса перед отправкой следующего? Пробовал Async/await но не разобрался с его работой...
var ArrCityName = [];
var Itteration = 0
var myFunc01 = function () {
const createRequest = {
url: 'http://ufo-api.herokuapp.com/api/sightings/search?limit=200',
method: 'GET',
header: {},
}
var myfunc02 = function () {
pm.sendRequest(createRequest, function (err, request) { pm.collectionVariables.set("s", request.json().sightings[Itteration].city),Itteration++, ArrCityName.push(pm.collectionVariables.get('s'))});
};
myfunc02();
setTimeout(function () {
if (Itteration < 200 && ArrCityName.length == Itteration) {
myFunc01()
}
}, 1000);
}
Ответы (2 шт):
Запускать таймаут в надежде, что он сработает после прилетевшего ответа - изначально неверный подход. Мало-ли из-за чего он может задержаться. Если всё нужно выполнять последовательно, пробуйте так:
let arrCityName = [];
let i = 0, limit = 200;
loop();
function loop() {
const createRequest = {
url: 'http://ufo-api.herokuapp.com/api/sightings/search?limit=200',
method: 'GET',
header: {},
}
pm.sendRequest(createRequest, function(err, request) {
if (err) {
console.warn("Bubu!!!");
return;
}
pm.collectionVariables.set("s", request.json().sightings[i].city);
arrCityName.push(pm.collectionVariables.get('s'));
// Получил, обработал данные...
if (++i < limit) {
console.log(i + "...");
loop(); // Только потом пойдет на следующий запрос.
} else {
console.log("done.", "\n", arrCityName);
}
});
}
Решение с помощью Fetch + Async/Await. Плюс пришлось подтянуть прокси.
const cityNames = [];
const proxyUrl = 'https://cors-anywhere.herokuapp.com/';
const requestUrl = 'https://ufo-api.herokuapp.com/api/sightings/search?limit=200';
const requestOptions = {
method: 'GET',
headers: {},
}
async function getCityNames() {
try {
const response = await fetch(proxyUrl + requestUrl, requestOptions);
const result = await response.json();
return result.sightings.map(({ city }) => city);
} catch(error) {
throw error;
}
}
(async () => {
try {
const names = await getCityNames();
cityNames.push(names);
const elements = names.map(name => `<li>${name}</li>`);
list.innerHTML = elements.join('');
} catch (error) {
console.log(error.message);
}
})();
<ol id="list"></ol>