Вам необходимо вернуть рекурсивный вызов getResult
и во избежание использования явного антипаттерна конструкции Promise (вместо return
Promises):
function getResult(getToken) {
return fetch(url, {
headers: {
"Authorization": something,
"Jenkins-Crumb": getToken
},
redirect: 'follow',
})
.then(response => response.json())
.then(data => {
if (data.result == null) {
console.log('retrieving data');
return getResult(getToken); // <-----------------------------
} else if (data.result == "SUCCESS") {
console.log('success');
return data; // <-------------------------------------------
}
// What if data.result is neither null nor SUCCESS? <--------
});
}
getResult(someToken).then(data => {
console.log(data);
}).catch(err => console.log(err))
Демонстрация в реальном времени:
const getUrl = () => Math.random() < 0.25 ? 'data:,{"result":"SUCCESS"}' : 'data:,{}';
function getResult(getToken) {
return fetch(getUrl(), {
headers: {
"Authorization": 'something',
"Jenkins-Crumb": getToken
},
redirect: 'follow',
})
.then(response => response.json())
.then(data => {
if (data.result == null) {
console.log('retrieving data');
return getResult(getToken); // <-----------------------------
} else if (data.result == "SUCCESS") {
console.log('success');
return data; // <-------------------------------------------
}
// What if data.result is neither null nor SUCCESS? <--------
});
}
getResult('someToken').then(data => {
console.log(data);
}).catch(err => console.log(err))
Также следует учитывать - ваши if
и else if
s в конце .then
могут не охватывать все возможности. Что если data.result
не является ни null
, ни 'SUCCESS'
? Учитывая ваш текущий лог c, вызов getResult
приведет к тому, что data
будет undefined
для потребителя. Если есть вероятность этого, вы можете выбросить ошибку или что-то в этом случае.
if (data.result == null) {
console.log('retrieving data')
return getResult(getToken) // <-----------------------
} else if (data.result == "SUCCESS") {
console.log('success')
return data; // <-----------------------
}
throw new Error('data.result is neither null nor 'SUCCESS'');