masz albo buga albo piszesz nieidiomatyczny kod. Idiomatyczny kod byłby taki, że funkcja getData zwraca obiekt promise:
Kopiuj
function getData() {
return Promise.resolve('foo');
}
i używałoby się tego kodu tak:
Kopiuj
getData().then(....);
// albo
await getData();
natomiast ty zrobiłeś coś takiego
Kopiuj
function getData() {
Promise.resolve('foo').then(doSomething);
}
(zamiast fetch itp. dałem Promise.resolve('foo') dla uproszczenia sytuacji).
czyli nie dałeś return, czyli funkcja zwróci undefined zamiast obiektu promise, co najwyżej sobie coś t
pytanie tylko, czy to jest twój błąd, czy może sposób pisania.
bo jeśli odpalisz doSomethingWithData
Kopiuj
.then((data) => doSomethingWithData(data))
to może osiągniesz co chcesz. Tylko w zasadzie cofnąłeś się w paradygmacie z promisów do callbacków. Promisy polegają na tym, że to taka przyszła wartość, którą można przekazywać albo mapować przez .then, więc jeśli robisz utilsową funkcję getData to idiomatycznie powinna zwrócić ona promise, a nie sama odpalać doSomethingWithData.
Chyba nie ma się do czego przyczepić. Ewentualnie brak parametrów funkcji. Skoro ma być uniwersalna to powinieneś przekazać URL, options, jakiś callback i ewentualnie funkcję do wykonania kiedy wystąpi błąd.
No ale po co, skoro to cofanie się z promisów do callbacków. Właśnie po to są promisy, żeby iść dalej z abstrakcją. Tak samo async/await są po to, żeby nie musieć używać .then bezpośrednio.
Chyba, że się nie da. Bo niestety async/await jest wygodne, ale nie obsługuje wszystkich opcji (bo niepotrzebnie zatrzymują działanie funkcji), dlatego czasem trzeba wracać do .then (plus w przypadku fetch i mapowania fetch(...).then(r => r.json()) IMO całkiem wygodnie się to robi na .then). Tak samo promisy nie są tak elastyczne jak callbacki (promise tylko raz się rozwiąże, a callback można wywoływać wiele razy), więc do callbacków też czasem trzeba wrócić. Tylko, że tutaj to nie ma sensu za bardzo.