2 回答

TA貢獻1858條經驗 獲得超8個贊
異步函數會返回一個 Promise,即使您沒有在代碼中定義 Promise。
我認為在等待語句中的所有承諾都得到解決后,這個返回的承諾就得到了履行。
我在下面的代碼中測試它,它還返回 Promise,只有在所有 Promise 解決后(在本例中為 3000 毫秒后)才會實現:
async function print2() {
? ?await console.log("abc")
? ? await new Promise((res, rej) => {
? ? ? ? setTimeout(() => {res(33)},3000)
? ? })
? ? await new Promise((res, rej) => {
? ? ? ? setTimeout(() => {res(33)},50)
? ? })
}

TA貢獻1810條經驗 獲得超4個贊
您可以說一個空函數本身返回undefined(實際上不返回任何內容)。看看下面的示例;
function print() {}
var returnVal = print(); // undefined
你會注意到那returnVal是undefined.
現在,如果我們有一些東西在body那里test(),但你仍然沒有傳遞任何返回值,那么returnVal仍然會是undefined。
function print() {
? ? console.log('abc');
}
var returnVal = print(); // undefined
因此,為了讓函數有返回值,我們只需要return它即可。
function print() {
? ? console.log('abc');
? ? return 1;
}
var returnVal = print(); // 1
當您將其轉換為異步函數時。
異步函數的主體可以被認為是被零個或多個等待表達式分割。頂級代碼,直到并包括第一個等待表達式(如果有),都是同步運行的。這樣,沒有await表達式的異步函數將同步運行。但是,如果函數體內有await 表達式,則異步函數將始終異步完成。
每個await 表達式之后的代碼可以被認為存在于.then 回調中。通過這種方式,通過函數的每個可重入步驟逐步構建承諾鏈。返回值構成了鏈中的最后一個環(huán)節(jié)。
現在,根據上述信息,以下是我們所知道的與您的問題相關的信息;
你
print()
沒有返回任何東西,這應該是undefined
async 函數將異步完成,這意味著它將始終返回Promise。待定、已履行或已拒絕
所以,在你的問題中說一下,這就是你的函數實際上所做的事情;
async function print() {
? ? console.log("abc"); // Prints 'abc'
}
// Function above is equivalent to;
function printEquivalentInNonAsync() {
? ? console.log("abc"); // Prints 'abc'
}
var returnVal = print(); // `returnVal` is `undefined`
并且,回答你的問題
如果沒有等待,那么為什么會執(zhí)行console.log?
無論等待異步函數,它仍然會執(zhí)行!-等待只是為了確保停止行執(zhí)行,直到異步函數(Promise)達到已完成或已拒絕。請注意,Promise 的第一個狀態(tài)是pending。
添加回答
舉報