簡體   English   中英

異步函數是真正的函數還是Promise對象?

[英]Are async functions really functions or Promise objects?

我只是嘗試異步等待問題語句的不同組合,而我嘗試了這一點,
基本上,我有兩個函數promise1()promise2() ,它們分別返回兩個promise,分別在3秒和1秒后解析值10和20。 以下是我編寫的代碼

 function promise1() { return new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(10) },3000) }) } function promise2() { return new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(20) },1000) }) } async function sum() { let num1 = await promise1(); let num2 = await promise2(); return num1+num2; } sum().then(s => console.log(s)) 
當我執行此代碼時,我得到30作為答案

就像上面的代碼一樣,如果我能夠應用.then() sum那是一個承諾嗎?
當我做console.log(typeof sum)它的sum是一個function而不是一個object那么異步函數到底是什么? 我嘗試搜索這種行為的答案,但找不到任何可以正確回答的來源。 如果有人回答了這個問題或告訴我可以獲取答案的在線資源或書籍,對我來說將是一個很大的幫助
我的節點版本是v10.15.3

謝謝

它們是返回值始終是一個承諾的函數。

 async function foo() { } const value = foo(); console.log(foo instanceof Function); console.log(foo instanceof Promise); console.log(value instanceof Function); console.log(value instanceof Promise); 


就像上面的代碼一樣,如果我能夠應用.then()求和,那是一個承諾嗎?

不,你不是。

sum.then()將不起作用。 sum().then()將。 ()將調用一個函數並為您提供返回值。

異步函數是真正的函數還是Promise對象?

它們確實是功能。 函數返回承諾。

就像上面的代碼一樣,如果我能夠應用.then() sum那是一個承諾嗎?

你沒有 您使用的.then()調用結果 sumsum().then(...)sum.then(...) 就像調用返回字符串的函數,然后對函數返回的值使用toUpperCase

這兩個函數本質上是等效的,其中包含一些次要細節:

// #1
function foo() {
    return new Promise((resolve, reject) => {
        try {
            getSomePromise()
            .then(result => result * 2)
            .catch(reject);
        } catch (error) {
            reject(error);
        }
    });
}

// #2
async function foo() {
    const result = await getSomePromise();
    return result * 2;
}

自然地,這不是您在現實生活中可能會寫成#1的方式,這是Promise創建反模式的一個示例,但這是對async函數在async樣子的合理解釋。 純粹為了完整性,您可能會像這樣編寫#1:

// #3
function foo() {
    return getSomePromise().then(result => result * 2);
}

區別在於,如果getSomePromise拋出錯誤而不是運行並返回承諾,則該函數(#3)將(同步)拋出錯誤,而上面的#1將返回拒絕的諾言。 async函數執行后者,這就是為什么以上面的方式編寫#1的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM