Saya membaca bahwa fungsi asinkron yang ditandai dengan async
kata kunci secara implisit mengembalikan sebuah janji:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
tapi itu tidak koheren ... dengan asumsi doSomethingAsync()
mengembalikan sebuah janji, dan kata kunci await akan mengembalikan nilai dari janji, bukan dari janji itsef, maka fungsi getVal saya harus mengembalikan nilai itu, bukan janji implisit.
Jadi apa sebenarnya masalahnya? Apakah fungsi yang ditandai oleh kata kunci async secara implisit mengembalikan promise atau kita mengontrol apa yang dikembalikan?
Mungkin jika kita tidak secara eksplisit mengembalikan sesuatu, maka mereka secara implisit mengembalikan janji ...?
Untuk lebih jelasnya, ada perbedaan antara di atas dan
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
Dalam sinopsis saya, perilaku tersebut memang tidak konsisten dengan pernyataan pengembalian tradisional. Tampaknya saat Anda secara eksplisit mengembalikan nilai non-promise dari suatu async
fungsi, ini akan memaksa membungkusnya dalam sebuah promise. Saya tidak punya masalah besar dengan itu, tapi itu menentang JS normal.
console.log
diperlihatkan?