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 шт):

Автор решения: eri
    else {
        console.log('Promise resolved but HTTP status failed - get_ids()');
        return await get_ids();
    }

Исправить вашу рекурсию нужно вот так.

Но почему не циклом? Рекурсия выдаст тормоза. Плоский код читается лучше.

Хотя я бы тут делал промис и сеттаймаут.

→ Ссылка