精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

不要再這樣編寫 Async/Await

開發 前端
下文就結合實際經驗,列出了一些常見的異步陷阱,以及更高級的用法與思考方式,讓代碼更健壯,也更易維護。

最開始接觸 async/await 時,很多人都會發出“終于有這個功能了!”的感嘆。它的語法清晰、可讀性強,用起來直觀又順手。

然而,用得越久,就會發現一些常見的“坑”時常在各種項目里出現:有些是代碼審查時發現的,有些是和同事討論時暴露的問題。這些都說明異步編程本質上并不簡單。

下文就結合實際經驗,列出了一些常見的異步陷阱,以及更高級的用法與思考方式,讓代碼更健壯,也更易維護。

從回調地獄到 async/await

還記得當初的回調地獄嗎?JavaScript 進化到現在,已經讓我們避免了深層嵌套的回調結構。

但功能變強大了,責任也跟著變大。下面是 async/await 中常見的三大“致命罪狀”。

1. 同步式的瀑布請求

糟糕示例:順序等待

在代碼審查里經常看到這樣的場景:本來可以并發執行的請求,卻被一個接一個地串行處理。

// ?? 不推薦
async function loadDashboard() {
  const user = await fetchUser();
  const posts = await fetchPosts();
  const notifications = await fetchNotifications();
}

如果每個請求都要 200ms,這里就總共要 600ms,給用戶的體驗自然不佳。

改進:并發執行

對于相互獨立的操作,應該使用并發來節省時間:

// ? 建議用 Promise.all
async function loadDashboard() {
  const [user, posts, notifications] = await Promise.all([
    fetchUser(),
    fetchPosts(),
    fetchNotifications()
  ]);
}

同樣是獲取用戶、帖子和通知,響應速度立刻加快三倍左右。不過,并發并非萬能。

  • 依賴關系:如果一個請求需要另一個請求返回的數據,就必須順序執行。
  • 競態條件:如果多個請求會同時修改某個共享資源,可能導致數據不一致。
  • 資源限制:并發過多會給服務器或瀏覽器帶來壓力。

舉例:危險的并發

// ?? 并行可能導致競態問題
await Promise.all([
  updateUserProfile(userId, { name: 'New Name' }),
  updateUserProfile(userId, { email: 'new@email.com' })
]);

// ? 先后執行以防數據沖突
const user = await updateUserProfile(userId, { name: 'New Name' });
await updateUserProfile(userId, { email: 'new@email.com' });

如果并行更新同一個用戶資料,服務器可能會出現覆蓋數據的情況。必須根據業務邏輯判斷能否并發執行。

2. 隱形錯誤:如何平衡異常處理

常見誤區:把錯誤直接“吞掉”

不少人喜歡在 catch 塊里寫個簡單的 console.error(error),然后返回 null,讓外層調用時貌似一切正常。

// ?? 隱形錯誤
async function fetchData() {
  try {
    const response = await fetch('/api/data');
    return await response.json();
  } catch (error) {
    console.error(error);
    return null;  // ?? 難以排查的隱患
  }
}

看似“處理”了錯誤,但實際上把錯誤原因都藏起來了。網絡斷了?JSON 解析失敗?服務器返回 500?外部代碼只能拿到 null,毫無頭緒。

更好的做法:區分場景處理

返回空值并非一直不對。如果它只是一個不關鍵的功能,比如推薦列表或活動通知,給用戶一個空狀態也許是更友好的方式。但如果是核心數據,就應該拋出異常或者做更明確的錯誤處理,讓上層邏輯感知到問題。

高級開發者通常會這樣寫:

// ? 有針對性的錯誤處理
async function fetchData(options = {}) {
  const { isCritical = true } = options;
  
  try {
    const response = await fetch('/api/data');
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return await response.json();
  } catch (error) {
    console.error('Data fetch failed:', error);
    
    if (isCritical) {
      // 對關鍵數據拋出自定義錯誤,交由更高層級處理
      throw new ApiError('Failed to fetch critical data', { cause: error });
    } else {
      // 非關鍵數據,可返回一個降級的默認值
      return { type: 'fallback', data: [] };
    }
  }
}

// 用法示例:
// 關鍵數據(出錯時會拋異常)
const userData = await fetchData({ isCritical: true });

// 非關鍵通知數據(出錯時返回空列表)
const notifications = await fetchData({ isCritical: false });

這樣就能同時兼顧穩定性和可維護性。關鍵數據絕不能“悄悄失敗”,而次要功能可以“優雅退化”。

3. 內存泄漏的陷阱和現代化的清理方式

典型誤區:無休止的輪詢

假設寫了一個定時輪詢,幾秒鐘拉取一次數據:

// ?? 隱形的內存殺手
async function startPolling() {
  setInterval(async () => {
    const data = await fetchData();
    updateUI(data);
  }, 5000);
}

表面看上去沒什么問題,但這樣會導致:

  • 組件或頁面卸載后依然在輪詢
  • 如果 fetchData() 執行得很慢,可能會同時發起多次請求
  • 更新 UI 時,目標 DOM 甚至可能已經被移除

改進:AbortController + 輪詢管理

下面這個示例借助 AbortController 實現了更安全的輪詢:

class PollingManager {
  constructor(options = {}) {
    this.controller = new AbortController();
    this.interval = options.interval || 5000;
  }

  async start() {
    while (!this.controller.signal.aborted) {
      try {
        const response = await fetch('/api/data', {
          signal: this.controller.signal
        });
        const data = await response.json();
        updateUI(data);
        
        // 等待下一次輪詢
        await new Promise(resolve => setTimeout(resolve, this.interval));
      } catch (error) {
        if (error.name === 'AbortError') {
          console.log('Polling stopped');
          return;
        }
        console.error('Polling error:', error);
      }
    }
  }

  stop() {
    this.controller.abort();
  }
}

// 在 React 組件中使用
function DataComponent() {
  useEffect(() => {
    const poller = new PollingManager({ interval: 5000 });
    poller.start();
    
    // 組件卸載時停止輪詢
    return () => poller.stop();
  }, []);
  
  return <div>Data: {/* ... */}</div>;
}

通過使用 AbortController,可以在需要時終止請求并及時釋放資源,更好地控制組件的生命周期和內存占用。

高級開發者的工具箱

1. 重試(Retry)模式

網絡環境不穩定或第三方服務時好時壞的情況下,只嘗試一次就放棄不是好辦法。可以加上重試和退避策略:

async function fetchWithRetry(url, options = {}) {
  const { maxRetries = 3, backoff = 1000 } = options;
  
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await fetch(url);
    } catch (error) {
      if (attempt === maxRetries - 1) throw error;
      // 退避延遲,指數增長
      await new Promise(r => setTimeout(r, backoff * Math.pow(2, attempt)));
    }
  }
}

除了基本的指數退避,還可以考慮:

  • 避免過度重試導致資源浪費
  • 區分哪些錯誤類型才需要重試
  • 使用斷路器(Circuit Breaker)模式保護系統
  • 加入隨機抖動(Jitter)防止大量請求同時重試

2. 資源管理

啟動異步操作簡單,關鍵是如何“優雅地”停止它們。通過統一的 ResourceManager 或類似模式,可以集中處理一些關閉連接、清理定時器、取消任務等邏輯:

class ResourceManager {
  cleanup() {
    // 在這里集中處理各種操作的終止和釋放
  }
}

真實場景中的模式

1. 統一的加載狀態管理

不要在每個組件都寫一堆 “正在加載”、“錯誤” 判斷。可以抽象出一個自定義 Hook 或者統一的加載管理邏輯:

const { data, loading, error } = useAsyncData(() => fetchUserData());

這樣可以:

  • 保持加載和錯誤狀態處理的一致性
  • 便于集中管理和優化
  • 在組件卸載時自動清理

2. 數據同步器(Data Synchronizer)

對于實時性要求高的應用,與其一個個寫請求,不如建立一個數據同步管理器,統一處理輪詢/訂閱/數據合并等邏輯:

const syncManager = new DataSyncManager({
  onSync: (data) => updateUI(data),
  onError: (error) => showError(error),
  syncInterval: 5000
});

幾條核心原則

并發原則

  • 讓互不依賴的操作同時執行
  • 小心競態和依賴順序
  • 不要為了并發而并發,要考慮業務邏輯

彈性原則(Resilience)

  • 及時重試和錯誤處理
  • 做好網絡或服務不可靠的準備
  • 避免一個錯誤拖垮整個系統

資源管理原則

  • 主動清理異步操作
  • 終止不再需要的請求
  • 防止內存泄漏

用戶體驗原則

  • 有意義的加載提示和錯誤信息
  • 保證核心功能的可用性
  • 在可能的情況下提供取消或中斷操作

常見問題

什么時候用 Promise.all,什么時候用 Promise.allSettled?

  • Promise.all 適合所有請求都必須成功的場景。
  • Promise.allSettled 允許部分失敗,適合容忍部分請求出錯的需求。
  • Promise.race 則常用于超時等情況。

在 React 中如何優雅地清理?

  • 善用 useEffect 的返回值進行清理。
  • 使用 AbortController 終止 HTTP 請求。
  • 組件卸載時,保證所有定時器、訂閱或輪詢都能停止。

展望

  • 檢查代碼:查找本可并發卻寫成串行的請求;檢查錯誤處理是否含糊不清;關注異步操作的清理是否充分。
  • 改進模式:引入更健壯的錯誤處理,增加重試邏輯,優化資源釋放。
  • 考慮擴展性:當用戶量或請求量激增時,如何保證依舊能流暢運行?如果某些服務變慢甚至掛掉,該如何部分降級?

為什么要在意這些細節

或許有人會說,“我的小項目沒這么復雜,用不著搞這些”。但真正的好代碼是能經得住放大和演進的。

  • 可擴展性:面對更多用戶和請求,系統能否穩健地運行
  • 用戶體驗:高并發、良好錯誤處理能讓應用體驗更流暢
  • 開發者體驗:清晰的異步邏輯有助于日后維護和團隊協作
  • 資源利用:合理的并發和清理機制能節約服務器和客戶端資源

這些并不是紙上談兵,而是大量實戰總結出來的硬道理。隨著項目的規模和復雜度不斷提升,這些異步編程模式會是你寫出高質量前端代碼的核心基石。

責任編輯:姜華 來源: 大遷世界
相關推薦

2022-06-16 10:37:09

asyncawait

2023-04-14 08:10:59

asyncawait

2014-07-15 10:31:07

asyncawait

2016-11-22 11:08:34

asyncjavascript

2021-09-27 09:33:27

內存創建集合

2023-10-08 10:21:11

JavaScriptAsync

2012-07-22 15:59:42

Silverlight

2021-07-20 10:26:12

JavaScriptasyncawait

2022-08-27 13:49:36

ES7promiseresolve

2021-06-28 07:27:43

AwaitAsync語法

2023-07-28 07:31:52

JavaScriptasyncawait

2022-07-11 10:32:35

Vue3await響應式

2024-12-23 08:00:45

2022-06-13 07:36:47

useEffectHooks

2021-06-15 05:36:45

Gulpawaitasync

2017-04-10 15:57:10

AsyncAwaitPromise

2024-11-13 01:00:18

asyncawait?編程

2017-08-02 14:17:08

前端asyncawait

2014-07-15 10:08:42

異步編程In .NET

2022-11-21 09:01:00

Swift并發結構
點贊
收藏

51CTO技術棧公眾號

国产亚洲欧美另类一区二区三区| 亚洲福利小视频| 伊人久久青草| 99国产精品久久久久99打野战| 黄色欧美成人| 亚洲激情在线观看| 色悠悠久久综合网| 四虎影视国产在线视频| 丁香另类激情小说| 国产不卡一区二区在线播放| 黄色一级大片在线免费观看| 精品国产一区二区三区不卡蜜臂| 色综合久久综合中文综合网| 中文字幕免费高| 青青草视频在线观看| 国产在线视频不卡二| 日本精品视频在线播放| 精品99久久久久成人网站免费 | 91久久精品一区二区| 久久久久久久久影视| 国内三级在线观看| 成人免费毛片aaaaa**| 国产欧美韩国高清| 欧美 日韩 精品| 欧美午夜久久| 久久久精品2019中文字幕神马| 日韩 中文字幕| 日韩欧美高清一区二区三区| 欧美日免费三级在线| 每日在线更新av| 2020国产在线视频| 中文字幕av一区二区三区| 久99久在线| 亚洲AV无码精品色毛片浪潮| 精彩视频一区二区三区| 国产97在线观看| 四虎精品永久在线| 亚洲美女91| 欧美福利视频在线| www.av视频| 婷婷久久综合| 久久韩国免费视频| 国产主播av在线| 欧美日韩国产一区二区三区不卡| 亚洲精品一区中文字幕乱码| 成人性生活免费看| 国产成人精品福利| 欧美第一区第二区| 中文字幕一区二区三区人妻在线视频 | 天天操天天干天天操| 国产成人综合网| 亚洲自拍偷拍色片视频| 国产精品国产精品国产专区| 免费看欧美美女黄的网站| 国产成人精品免高潮费视频| 免费的毛片视频| 日韩精品亚洲一区二区三区免费| 日本国产高清不卡| 亚洲婷婷综合网| 免费在线亚洲欧美| 欧美在线播放视频| 国产女主播喷水视频在线观看| 噜噜噜在线观看免费视频日韩| 欧美整片在线观看| 亚洲天堂男人av| 青青国产91久久久久久| 国产精品一二三在线| 国产又粗又猛又黄| 国产成人在线电影| 精品国产一区二区三区麻豆小说 | 国产精品久久久久久久午夜| 中文字幕一区二区三区波野结 | 一本色道**综合亚洲精品蜜桃冫| 日本精品一区在线观看| 亚洲不卡系列| 欧美一区二区三区成人| 香蕉久久久久久av成人| 麻豆国产欧美一区二区三区r| 亚洲精品之草原avav久久| 亚洲ⅴ国产v天堂a无码二区| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 中文有码一区| www国产精品com| 国产一级av毛片| 午夜亚洲视频| 成人黄色片在线| 三级网站在线看| 欧美国产乱子伦| 99中文字幕在线观看| 草草视频在线观看| 欧美午夜免费电影| 国产男女无遮挡猛进猛出| 亚洲动漫在线观看| 久久久国产精品亚洲一区| 亚州国产精品视频| 免费成人在线网站| 国产伦精品一区二区三毛| 国内在线精品| 亚洲成a人片综合在线| 日本成人中文字幕在线| 欧洲一区在线| 国产午夜一区二区| 精品无码黑人又粗又大又长| 日本不卡一二三区黄网| 国产精品v欧美精品v日韩| av资源在线观看免费高清| 亚洲自拍与偷拍| 手机在线看福利| 露出调教综合另类| 久久成人精品电影| 亚洲精品一区二区二区| 成年人午夜久久久| av电影一区二区三区| 久九九久频精品短视频| 精品久久久久久久久久久院品网| 少妇无套高潮一二三区| 精品成人国产| 亚洲最大福利网| av在线电影播放| 精品国产福利视频| 亚洲美女高潮久久久| 久久精品播放| 国产精品久久久久久久美男| 婷婷av一区二区三区| 亚洲精品美腿丝袜| 五月激情五月婷婷| 精品理论电影| 欧美在线视频一区二区| 亚洲精品国产av| 亚洲啪啪综合av一区二区三区| 国产免费人做人爱午夜视频| 欧美成a人免费观看久久| 超碰97人人做人人爱少妇| 亚洲一卡二卡在线观看| 国产午夜精品久久久久久免费视| 黄色av网址在线播放| 无码国模国产在线观看| 久久久精品国产一区二区| 中文字幕第31页| 国产欧美va欧美不卡在线| 国产成人亚洲精品无码h在线| 草草视频在线一区二区| 欧美激情按摩在线| 国产黄色片网站| 一区二区三区高清在线| 国产又粗又猛大又黄又爽| 香蕉国产精品| 亚洲综合一区二区不卡| 国内外激情在线| 色老综合老女人久久久| 在线观看国产精品一区| 日韩精品福利网| 日韩在线电影一区| 99久久精品一区二区成人| 一区二区三区www| 中文字幕a级片| 最新热久久免费视频| 爱豆国产剧免费观看大全剧苏畅 | 日本精品在线播放| 欧美肥臀大乳一区二区免费视频| 性猛交xxxx乱大交孕妇印度| 亚洲精品成人在线| 中文字幕天堂av| 亚洲一区二区三区高清不卡| 欧美日韩精品免费观看| 97se综合| 久久久成人的性感天堂| 亚洲第一第二区| 欧美日韩免费观看中文| 三上悠亚影音先锋| 久久精品国产精品亚洲综合| 欧美aaa在线观看| 成人在线超碰| 日本精品视频在线| 久久综合网导航| 欧美成人精品福利| 成人免费毛片男人用品| 国产精品国产三级国产aⅴ原创| 国产黑丝在线视频| 国产视频一区欧美| 夜夜爽99久久国产综合精品女不卡| 综合欧美精品| 97超级碰在线看视频免费在线看 | 91黑丝高跟在线| 日本护士...精品国| 欧美性大战久久| 久久成人在线观看| 久久久99精品免费观看不卡| 亚洲高清在线不卡| 一区二区三区四区五区在线| 亚洲欧洲久久| 黑人久久a级毛片免费观看| 国产精品mp4| 日本电影在线观看| 亚洲午夜激情免费视频| 午夜精品久久久久久久第一页按摩| 精品国产91久久久| 希岛爱理中文字幕| 久久久美女毛片| 极品人妻一区二区| 日韩黄色一级片| 国产一区二区视频播放| 97人人精品| 麻豆精品传媒视频| 亚洲2区在线| 国产精品一区二区三区久久久| 国产一线二线在线观看| 日韩小视频在线| 内衣办公室在线| 欧美成人三级电影在线| 在线观看国产黄| 欧美性xxxxxxx| 久久97人妻无码一区二区三区| 国产精品福利电影一区二区三区四区 | av成人亚洲| 欧美一区二区视频97| av毛片在线免费| 北条麻妃一区二区三区中文字幕| 色猫av在线| 亚洲国产精品久久91精品| 国产视频在线一区| 欧美日韩中文另类| 中文字幕xxxx| 欧美日韩在线视频观看| 久久久久噜噜噜亚洲熟女综合| 国产精品国产三级国产专播品爱网| 五级黄高潮片90分钟视频| 丰满岳乱妇一区二区三区| 超碰成人在线播放| 免费成人在线影院| 成年网站在线播放| 日韩成人一区二区| 白嫩少妇丰满一区二区| 亚洲影音一区| 国产视频九色蝌蚪| 国产精品五区| 美女日批免费视频| 在线亚洲免费| 成年人午夜视频在线观看| 欧美日韩国产精品一区二区亚洲| 国产精品jizz在线观看老狼| 欧美日韩水蜜桃| 日韩精品不卡| 欧美日韩有码| 亚洲日本欧美在线| 欧美丰满日韩| 影音先锋在线亚洲| 五月精品视频| 男人的天堂视频在线| 欧美a级片一区| 欧美一二三不卡| 国产精品vip| 男人添女人荫蒂免费视频| 国内精品嫩模av私拍在线观看| 免费日韩在线观看| 精品电影一区| 亚洲中文字幕无码中文字| 天堂蜜桃一区二区三区 | 国产呦萝稀缺另类资源| 人人爽人人爽av| 国产精品综合一区二区| 2025中文字幕| 91亚洲国产成人精品一区二三| av网站有哪些| 欧美激情一二三区| 国产稀缺精品盗摄盗拍| 亚洲国产精品一区二区久久恐怖片 | 天天av综合网| 一本久久综合亚洲鲁鲁| 国产丝袜在线| 91国内免费在线视频| 高清av一区| 亚洲一区二区免费在线| 久本草在线中文字幕亚洲| 蜜桃999成人看片在线观看| 日韩国产专区| 免费看日本黄色| 麻豆亚洲精品| 国产精品嫩草影视| av高清不卡在线| 91社区视频在线观看| 亚洲精品免费在线| 久久久久久久久久久影院| 黄色毛片在线看| 日韩av综合网站| 97电影在线观看| 欧美另类在线观看| 在线看片福利| 91在线无精精品一区二区| 麻豆视频一区| 国产精品jizz在线观看老狼| 亚洲人成高清| gogogo高清免费观看在线视频| 国v精品久久久网| 影音先锋男人在线| 五月婷婷色综合| 国产又粗又猛又黄又爽| 亚洲国产成人爱av在线播放| 国产高清视频在线观看| 九九综合九九综合| 激情国产在线| 欧美绝品在线观看成人午夜影视| 国产精品国产三级国产普通话对白| 亚洲第一区在线观看| 亚洲s色大片| 992tv成人免费影院| 伊人亚洲精品| 欧美一级二级三级九九九| 激情自拍一区| 国产免费中文字幕| 久久久不卡网国产精品一区| 国产真实乱人偷精品视频| 欧美久久久久久久久久| 你懂的免费在线观看| 久久久久久亚洲精品| 中文字幕成人| 亚洲日本精品| 天堂影院一区二区| 朝桐光av一区二区三区| 亚洲综合免费观看高清完整版 | 日韩123区| 91视频国产精品| 日韩中字在线| 日本美女高潮视频| 久久众筹精品私拍模特| 日韩精品视频播放| 日韩精品一区二区三区视频播放 | 一呦二呦三呦国产精品| 久久99国产精品一区| 奇米在线7777在线精品| 亚洲激情视频小说| 狠狠做深爱婷婷久久综合一区| 黄频网站在线观看| 欧美激情xxxxx| 综合中文字幕| 国产肉体ⅹxxx137大胆| 国产剧情一区二区| 欧美一区二区三区爽爽爽| 51精品秘密在线观看| 免费av网站在线观看| 国产日韩在线一区| 日韩理论电影| 午夜免费福利在线| 亚洲国产精品v| 伊人网av在线| 色综久久综合桃花网| 欧美成人xxxx| 一区二区三区欧美成人| 激情综合色播五月| 久艹在线观看视频| 91精品国产综合久久福利| 午夜免费视频在线国产| 成人天堂噜噜噜| 欧美黄色免费| 97精品人妻一区二区三区蜜桃| 亚洲成人在线观看视频| 天堂中文在线看| 久久久在线观看| 岳的好大精品一区二区三区| 日韩精品一区中文字幕| 国产精品久久三区| 国产三级第一页| 欧美极品第一页| 日韩精品免费一区二区三区竹菊| 日本三级免费网站| 久久久91精品国产一区二区精品| 成人一二三四区| 久久夜色精品国产欧美乱| 欧美欧美在线| 91专区在线观看| 久久久精品国产免费观看同学| 探花国产精品一区二区| 久久久www成人免费精品张筱雨| 97久久综合区小说区图片区| 欧美亚洲另类色图| 国产精品美女一区二区在线观看| 国产精品爽爽久久| 亚洲97在线观看| 日本久久一二三四| 国产吃瓜黑料一区二区| 色婷婷综合久久久| 超碰超碰在线| 欧美18视频| 激情综合色播五月| 国产成人精品网| 久久亚洲影音av资源网| 欧美挤奶吃奶水xxxxx| 日韩高清第一页| 精品欧美国产一区二区三区| 亚洲搞黄视频| 久久天堂国产精品| 国产在线一区二区综合免费视频| 亚洲黄色一区二区| 久久久精品久久久久| 天天久久夜夜| 亚欧精品在线视频| 欧美艳星brazzers| av漫画网站在线观看| 国产a级片免费看| 久久久国产一区二区三区四区小说 |