Wiem o co Ci chodzi, i masz rację.
Więc tak: gdyby Promise
był idealną modaną, to masz rację, to nie powinno działać, i powinno być tak jak to opisałeś. Problem pojawia się, bo Promise nie jest idealną monadą.
I teraz co to dokładnie znaczy: otóż, w javie np możesz mieć Optional<Optional<Integer>>
. Ale w JavaScript nie możesz mieć promise'a w promisie :/ Niestety. Innymi słowy, jak spróbujesz zwrócić Promise z promise'a, to dostaniesz jeden promise.
Dlatego np działa takie coś:
fetch('http://example.com/movies.json')
.then(response => response.json()) // json() zwraca Promise, ale nie trzeba go "ręcznie" odpakować, bo JS sam zamienia Promise<Promise<?>> na Promise<?>
.then(data => console.log(data));
Możesz to sobie zobrazować takim kodem.
// promise w promisie
const promiseWPromisie = new Promise(resolve => resolve(new Promise(a => a(2));
// jeden then
promiseWPromisie.then(result => console.log(result));
Teraz, Twój przykład z Promise.resolve()
to jest po prostu szczególny przypadek tej zasady, tylko zamiast jawnego then()
u Ciebie jest Promise.resolve()
.