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(....);
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.
rafal95pKwestia gustu
Oraz doświadczenia :)