[英]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))
就像上面的代碼一樣,如果我能夠應用.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()
的調用的結果 sum
( sum().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.