偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

async 函數(shù)的返回值到底是什么

開發(fā)
我們每天都在寫 await fetch(...)。但一個 async 函數(shù),它的返回值究竟是什么?

async/await 已經(jīng)成為處理異步操作的標(biāo)配,它讓我們能夠用看似同步的方式書寫異步代碼,極大地提高了代碼的可讀性和可維護(hù)性。我們每天都在寫 await fetch(...)。

但:一個 async 函數(shù),它的返回值究竟是什么?

場景一:返回一個非 Promise 值

這是最常見也最容易產(chǎn)生困惑的情況。我們來看一個最簡單的 async 函數(shù):

async function getNumber() {
  return 42; // 返回一個普通的數(shù)字
}

const result = getNumber();
console.log(result);

如果你運(yùn)行這段代碼,控制臺輸出的并不會是 42,而是:

Promise { <pending> }

很快,這個 Promise 的狀態(tài)會變?yōu)?nbsp;fulfilled,并且其值為 42。

背后發(fā)生了什么?

當(dāng) async 函數(shù)的 return 語句返回一個非 Promise 值(如數(shù)字、字符串、對象等)時,JavaScript 引擎會自動將其包裝在一個 resolved狀態(tài)的 Promise 中。換句話說,上面的代碼在底層等價于:

function getNumber() {
  return Promise.resolve(42);
}

這就是為什么直接調(diào)用 getNumber() 會得到一個 Promise。為了獲取到內(nèi)部的值 42,我們必須使用 await 或者 .then() 來“解包”:

場景二:返回一個 Promise

如果 async 函數(shù)本身就返回一個 Promise,情況會怎樣?JavaScript 引擎會再把它包一層,變成 Promise<Promise<T>> 嗎?

答案是:不會。

async 函數(shù)足夠智能,如果它檢測到返回值已經(jīng)是一個 Promise,它會直接返回這個 Promise,而不會進(jìn)行額外的包裝。

async function fetchUser() {
 // 返回一個顯式的 Promise
 return new Promise(resolve => {
    setTimeout(() => {
      resolve({ name: 'Alice' });
    }, 1000);
  });
}

const promise = fetchUser();
console.log(promise); // Promise { <pending> }

promise.then(user => {
 console.log(user); // 1秒后輸出: { name: 'Alice' }
});

這個行為至關(guān)重要,它保證了 async 函數(shù)的返回值總是一個行為一致的、可 await 的對象,避免了不必要的 Promise 嵌套。

場景三:函數(shù)內(nèi)部拋出錯誤

如果在 async 函數(shù)內(nèi)部 throw 一個錯誤,會發(fā)生什么?程序會崩潰嗎?

不一定。async 函數(shù)會將拋出的錯誤捕獲,并將其作為 一個 rejected 狀態(tài)的 Promise 返回。

這個 rejected Promise 的 reason 就是我們拋出的那個 Error 對象。因此,我們可以用標(biāo)準(zhǔn)的 Promise 錯誤處理方式來捕獲它:

// 使用 try...catch 配合 await
async function handleFailure() {
 try {
    await willFail();
  } catch (error) {
    console.error(error.message); // 輸出: Something went wrong!
  }
}
handleFailure();

// 或者使用 .catch()
willFail().catch(error => {
 console.error(error.message); // 輸出: Something went wrong!
});

這種機(jī)制將同步代碼中的 try...catch 錯誤處理模型,無縫地融入到了異步流程控制中。

場景四:沒有 return 語句

如果一個 async 函數(shù)執(zhí)行完畢但沒有 return 語句,它的返回值是什么?

和普通函數(shù)一樣,沒有 return 語句的函數(shù)會隱式地返回 undefined。根據(jù)場景一的規(guī)則,這個 undefined 會被 async 關(guān)鍵字包裝成一個 resolved 狀態(tài)的 Promise。

async function doNothing() {
  const a = 1 + 1;
  // 沒有 return
}

doNothing().then(value => {
  console.log(value); // 輸出: undefined
});

所以,即使函數(shù)什么都不返回,它依然遵循“永遠(yuǎn)返回一個 Promise”的黃金法則,只不過這個 Promise 的 resolved 值是 undefined。

async/await 本質(zhì)上是 Promise 的語法糖。它的設(shè)計(jì)初衷就是為了讓開發(fā)者能夠以更直觀的方式處理異步邏輯。

async 的“包裝”行為和 await 的“解包”行為,兩者相輔相成,構(gòu)成了這套優(yōu)雅語法糖的核心。

責(zé)任編輯:趙寧寧 來源: JavaScript
相關(guān)推薦

2022-10-08 00:00:00

Spring數(shù)據(jù)庫項(xiàng)目

2020-03-05 10:28:19

MySQLMRR磁盤讀

2011-04-27 09:30:48

企業(yè)架構(gòu)

2020-10-14 06:22:14

UWB技術(shù)感知

2020-09-27 06:53:57

MavenCDNwrapper

2010-11-01 01:25:36

Windows NT

2020-09-22 08:22:28

快充

2021-08-13 11:31:23

HTTP

2009-06-09 22:11:44

JavaScriptObject

2023-10-11 08:29:54

volatileJava原子性

2021-09-03 09:12:09

Linux中斷軟件

2020-08-04 14:20:20

數(shù)據(jù)湖Hadoop數(shù)據(jù)倉庫

2019-10-30 10:13:15

區(qū)塊鏈技術(shù)支付寶

2010-04-22 14:14:29

Live-USB

2013-06-09 09:47:31

.NetPDBPDB文件

2021-07-07 05:07:15

JDKIterator迭代器

2021-01-21 21:24:34

DevOps開發(fā)工具

2021-09-01 23:29:37

Golang語言gRPC

2024-02-04 00:01:00

云原生技術(shù)容器

2021-02-05 10:03:31

區(qū)塊鏈技術(shù)智能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號