Czytałem, że funkcje asynchroniczne oznaczone async
słowem kluczowym niejawnie zwracają obietnicę:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
ale to nie jest spójne ... zakładając, że doSomethingAsync()
zwraca obietnicę, a słowo kluczowe await zwróci wartość z obietnicy, a nie z jej samej, wówczas moja funkcja getVal powinna zwrócić tę wartość, a nie ukrytą obietnicę.
Więc o co dokładnie chodzi? Czy funkcje oznaczone słowem kluczowym async niejawnie zwracają obietnice, czy też kontrolujemy to, co zwracają?
Może jeśli nie zwrócimy czegoś jawnie, to pośrednio zwrócą obietnicę ...?
Aby być bardziej zrozumiałym, istnieje różnica między powyższymi a
function doSomethingAync(charlie) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(charlie || 'yikes');
}, 100);
})
}
async function getVal(){
var val = await doSomethingAync(); // val is not a promise
console.log(val); // logs 'yikes' or whatever
return val; // but this returns a promise
}
var ret = getVal();
console.log(ret); //logs a promise
W moim streszczeniu zachowanie jest rzeczywiście niezgodne z tradycyjnymi instrukcjami powrotu. Wygląda na to, że gdy jawnie zwrócisz wartość, która nie jest obietnicą z async
funkcji, wymusi to zawinięcie jej w obietnicę. Nie mam z tym dużego problemu, ale przeciwstawia się normalnemu JS.
console.log
pokazuje?