Async/await и рекурсивный вызов функции, если !response.ok
Есть функция, в которой запрос на получение id
с сервера, return id
в случае response.ok
и перезапуск функции, в случае !response.ok
.
Есть вторая функция, в которой вызов первой функции с присвоением результата переменной. Далее эта переменная используется при запуске следующей функции.
Проблема в том, что если в первой функции был получен ответ !response.ok
, то во второй функции await function
считается выполненным и в переменную записывается undefined
.
async function get_ids (){
config.body = JSON.stringify({'action':'get_ids'});
try {
let response = await fetch(host, config);
if (response.ok) {
console.log('Promise resolved and HTTP status is successful');
let ids = await response.json();
ids = ids.result;
return ids;
}
else {
get_ids();
console.log('Promise resolved but HTTP status failed - get_ids()');
}
}
catch (error){
console.error('Promise rejected ' + error);
}
}
Если при первом проходе получили !response.ok
...
async function main(){
let ids = await get_ids(); // ... тогда тут будет undefined
let items = await get_items(ids); // ... и тут ошибка, ids = undefined
}
main();
Т.е. перезапуск функции get_ids
происходит, в случае !response.ok
, при первом проходе, но в let ids = await get_ids();
- получим undefined
, т.к. считается выполненным, хоть и с ошибкой.
Пробовал вводить дополнительную функцию проверки, но где-то запутался или оно так не работает, в общем фигня в итоге получилась. В ids опять undefined попадает, хотя вроде как функция проверки выполняется и в процессе в console.log(ids) попадает нормальный результат.
async function check_ids(ids){
if(ids === undefined){
ids = await get_ids();
check_ids(ids);
} else {
return ids;
}
}
и далее в основной функции:
let ids = await get_ids();
ids = await check_ids(ids);
console.log(ids); - тут опять undefined
Можно как-то в этой конструкции:
if(!response.ok)
сделать reject
, чтобы во второй функции await
сработал только в случае ответа response.ok
?
Ответы (1 шт):
else {
console.log('Promise resolved but HTTP status failed - get_ids()');
return await get_ids();
}
Исправить вашу рекурсию нужно вот так.
Но почему не циклом? Рекурсия выдаст тормоза. Плоский код читается лучше.
Хотя я бы тут делал промис и сеттаймаут.