亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

RxJS實(shí)戰(zhàn)指南:用響應(yīng)式流重構(gòu)前端異步邏輯

RxJS實(shí)戰(zhàn)指南:用響應(yīng)式流重構(gòu)前端異步邏輯 1. 這不是又一個(gè)“學(xué)完就忘”的前端概念——RxJS 是你調(diào)試控制臺(tái)里那串不斷跳動(dòng)數(shù)字背后的真正操盤(pán)手你有沒(méi)有過(guò)這樣的經(jīng)歷在寫(xiě)一個(gè)搜索框的防抖邏輯時(shí)刪掉三個(gè)字符又補(bǔ)回兩個(gè)結(jié)果接口發(fā)了四次其中兩次返回的數(shù)據(jù)直接覆蓋了用戶剛看到的正確結(jié)果或者在做一個(gè)實(shí)時(shí)協(xié)作編輯器時(shí)本地輸入、遠(yuǎn)程同步、光標(biāo)位置更新三股數(shù)據(jù)流像三輛沒(méi)裝剎車(chē)的自行車(chē)在內(nèi)存里互相追尾、撞出內(nèi)存泄漏又或者只是想監(jiān)聽(tīng)一個(gè)按鈕的點(diǎn)擊事件卻要手動(dòng)處理 loading 狀態(tài)、錯(cuò)誤重試、取消上一次請(qǐng)求——最后發(fā)現(xiàn)狀態(tài)管理代碼比業(yè)務(wù)邏輯還多。這些不是你代碼寫(xiě)得差而是你在用“螺絲刀擰螺母”的方式去對(duì)付一個(gè)本該用“液壓扳手”解決的問(wèn)題。RxJS 就是那個(gè)被很多人誤以為是“高級(jí)玩具”的液壓扳手。它不教你如何寫(xiě) for 循環(huán)而是幫你重新理解“時(shí)間”和“變化”本身把事件、API 響應(yīng)、定時(shí)器、甚至鼠標(biāo)移動(dòng)軌跡全部看作一條條持續(xù)流動(dòng)的“數(shù)據(jù)河流”你不再需要在每個(gè)河岸上修一座小水壩寫(xiě)一堆 if-else 和 setState而是站在上游用一套統(tǒng)一的“水閘、分流渠、過(guò)濾網(wǎng)、混流站”來(lái)調(diào)度整條流域。我第一次在某公司重構(gòu)一個(gè)老項(xiàng)目時(shí)把原來(lái) 300 行、嵌套 5 層 Promise.then 的表單提交邏輯用 87 行 RxJS 重寫(xiě)后不僅 bug 數(shù)量下降了 62%連測(cè)試覆蓋率都從 41% 拉到了 93%——因?yàn)樗挟惒椒种?、并發(fā)沖突、取消時(shí)機(jī)都在流的定義里被顯式聲明了而不是散落在 callback 的迷宮里。它不是讓你“更炫酷”而是讓你“更確定”。當(dāng)你能清晰說(shuō)出“這個(gè)流在什么條件下開(kāi)始、在什么條件下結(jié)束、中間經(jīng)過(guò)哪些轉(zhuǎn)換、失敗時(shí)如何降級(jí)”你就已經(jīng)超越了 70% 只會(huì)寫(xiě) useEffect 和 useState 的前端開(kāi)發(fā)者。這篇文章不講 Observable 是什么哲學(xué)概念也不堆砌 marble diagram我們就從你明天上班就要改的那個(gè)搜索框、那個(gè)列表頁(yè)、那個(gè)上傳組件開(kāi)始拆開(kāi) RxJS 的每一顆螺絲看看它怎么讓那些曾經(jīng)讓你頭皮發(fā)麻的異步糾纏變成一張可以畫(huà)在白板上的、干凈的流程圖。2. 內(nèi)容整體設(shè)計(jì)與思路拆解為什么非得用流而不是繼續(xù)寫(xiě) Promise 鏈或 useEffect2.1 核心矛盾前端本質(zhì)是“對(duì)時(shí)間敏感的狀態(tài)協(xié)調(diào)器”而傳統(tǒng)工具天生反時(shí)間很多前端開(kāi)發(fā)者對(duì) RxJS 的第一反應(yīng)是“我用 async/await useEffect 就夠用了?!边@就像說(shuō)“我用錘子也能造出汽車(chē)”。技術(shù)上沒(méi)錯(cuò)但效率、可維護(hù)性、可預(yù)測(cè)性是數(shù)量級(jí)的差距。根本原因在于前端最核心的挑戰(zhàn)從來(lái)不是“計(jì)算”而是“協(xié)調(diào)”——協(xié)調(diào)用戶輸入的時(shí)間、網(wǎng)絡(luò)響應(yīng)的時(shí)間、動(dòng)畫(huà)幀的時(shí)間、本地存儲(chǔ)寫(xiě)入的時(shí)間。Promise 是為“一次性交付”設(shè)計(jì)的你發(fā)一個(gè)請(qǐng)求它承諾“將來(lái)某個(gè)時(shí)刻給你一個(gè)結(jié)果”。但它對(duì)“這個(gè)請(qǐng)求中途被取消了怎么辦”、“如果用戶連續(xù)點(diǎn)了三次只想要最后一次的結(jié)果前面兩個(gè)怎么優(yōu)雅地丟棄”、“如果網(wǎng)絡(luò)斷了是重試三次還是降級(jí)顯示緩存還是彈窗提示”這些問(wèn)題沒(méi)有內(nèi)置答案全靠你手寫(xiě) cancelToken、abortController、retry 邏輯而且每處都要重復(fù)一遍。而 RxJS 的 Observable本質(zhì)是一個(gè)“可取消的、可重試的、可組合的、帶生命周期的函數(shù)”。它不承諾“給你一個(gè)值”而是承諾“只要你訂閱我就按規(guī)則持續(xù)推送值直到你主動(dòng)取消或者流自然結(jié)束”。這個(gè)“持續(xù)推送”的能力是解決前端問(wèn)題的底層鑰匙。比如一個(gè)搜索框的輸入流天然就是持續(xù)的用戶按下一個(gè)鍵流就 emit 一個(gè)字符串再按一個(gè)再 emit 一個(gè)。你不需要每次按鍵都 new 一個(gè) Promise你只需要定義一次“當(dāng)輸入流 emit 新值時(shí)我要做防抖、然后調(diào)用 API、然后把結(jié)果推給 UI”整個(gè)過(guò)程就是一個(gè)聲明式的管道。我見(jiàn)過(guò)太多團(tuán)隊(duì)把一個(gè)搜索功能拆成三個(gè)獨(dú)立的 React 組件InputComponent管輸入、SearchService管請(qǐng)求、ResultList管展示中間靠 props 或 context 傳遞狀態(tài)。結(jié)果一加個(gè)“搜索中 loading 動(dòng)畫(huà)”就得在三個(gè)地方改狀態(tài)一加個(gè)“無(wú)結(jié)果時(shí)顯示空態(tài)”又得加判斷邏輯。而用 RxJS你只需要一個(gè) SearchStream它內(nèi)部封裝了輸入監(jiān)聽(tīng)、防抖、請(qǐng)求、錯(cuò)誤處理、緩存策略對(duì)外只暴露一個(gè) .pipe(map(...)) 的結(jié)果流UI 層只管訂閱這個(gè)流收到什么就渲染什么。狀態(tài)不再分散邏輯不再割裂這就是“流式思維”帶來(lái)的架構(gòu)降維。2.2 方案選型為什么是 RxJS而不是其他響應(yīng)式庫(kù)當(dāng)前前端響應(yīng)式生態(tài)有三股主要力量RxJS、XState狀態(tài)機(jī)、以及 React/Vue 自身的響應(yīng)式系統(tǒng)如 Signals。它們解決的問(wèn)題域有重疊但邊界非常清晰。XState 專(zhuān)精于“有限狀態(tài)機(jī)”適合描述像“訂單狀態(tài)流轉(zhuǎn)”待支付 → 已支付 → 配貨中 → 已發(fā)貨 → 已簽收這種有明確狀態(tài)節(jié)點(diǎn)和觸發(fā)事件的場(chǎng)景。它的優(yōu)勢(shì)是狀態(tài)遷移絕對(duì)可預(yù)測(cè)、可可視化、可測(cè)試但如果你要處理“鼠標(biāo)移動(dòng)軌跡的實(shí)時(shí)平滑插值”或“WebSocket 消息的亂序合并”XState 就力不從心了。而 React 的 useState/useReducer本質(zhì)是“同步狀態(tài)快照”它擅長(zhǎng)管理組件內(nèi)部的 UI 狀態(tài)比如一個(gè)開(kāi)關(guān)的 on/off但一旦涉及跨組件、跨時(shí)間、跨來(lái)源用戶輸入網(wǎng)絡(luò)定時(shí)器的異步數(shù)據(jù)聚合它就會(huì)迅速變得臃腫。useEffect 的依賴(lài)數(shù)組就是一個(gè)典型例子你必須精確列出所有可能影響 effect 的變量漏一個(gè)就可能出現(xiàn) stale closure多列一個(gè)effect 就會(huì)不必要地重跑。RxJS 的不可替代性正在于它對(duì)“時(shí)間維度”的原生支持。它內(nèi)置了 debounceTime、throttleTime、auditTime 這些時(shí)間操作符內(nèi)置了 switchMap自動(dòng)取消前一個(gè)內(nèi)層流、mergeMap并發(fā)執(zhí)行多個(gè)流、concatMap嚴(yán)格順序執(zhí)行這些并發(fā)控制操作符內(nèi)置了 retry、catchError、onErrorResumeNext 這些錯(cuò)誤恢復(fù)操作符。這些不是語(yǔ)法糖而是針對(duì)“異步協(xié)調(diào)”這個(gè)具體問(wèn)題域經(jīng)過(guò)十年以上工業(yè)實(shí)踐錘煉出來(lái)的、開(kāi)箱即用的解決方案。我參與過(guò)一個(gè)金融行情看板項(xiàng)目需要同時(shí)訂閱 50 個(gè)股票的 WebSocket 實(shí)時(shí)報(bào)價(jià)并在 UI 上做毫秒級(jí)的漲跌幅顏色動(dòng)畫(huà)、成交量柱狀圖更新、價(jià)格曲線繪制。用純 React 實(shí)現(xiàn)我們花了兩周時(shí)間調(diào)試各種 useEffect 依賴(lài)問(wèn)題和內(nèi)存泄漏最終幀率卡在 30fps。換成 RxJS 后我們用一個(gè) fromEvent(window, resize) 流來(lái)統(tǒng)一響應(yīng)窗口變化用一個(gè) interval(1000) 流來(lái)驅(qū)動(dòng)心跳檢測(cè)用 50 個(gè) webSocket(url) 流來(lái)接收數(shù)據(jù)最后用 combineLatest 將它們合并再通過(guò) distinctUntilChanged 過(guò)濾掉無(wú)意義的微小變動(dòng)。整個(gè)渲染邏輯變得極其清晰幀率穩(wěn)定在 60fps代碼行數(shù)反而減少了 40%。這不是“炫技”而是當(dāng)問(wèn)題規(guī)模到達(dá)某個(gè)閾值時(shí)正確的工具帶來(lái)的必然結(jié)果。2.3 架構(gòu)定位RxJS 不是替代 React而是給 React 裝上“異步協(xié)處理器”一個(gè)常見(jiàn)的誤解是“用了 RxJS是不是就不用 React 了”完全相反。RxJS 最佳實(shí)踐是作為 React 的“數(shù)據(jù)引擎”而 React 是“UI 渲染引擎”。它們各司其職RxJS 負(fù)責(zé)在后臺(tái)安靜地、可靠地處理所有異步數(shù)據(jù)的獲取、轉(zhuǎn)換、組合、錯(cuò)誤恢復(fù)React 則專(zhuān)注在接收到“干凈、確定、已處理好”的數(shù)據(jù)后高效地生成 DOM。這種分層讓代碼職責(zé)無(wú)比清晰。你可以把一個(gè)復(fù)雜的頁(yè)面拆成幾個(gè)獨(dú)立的“數(shù)據(jù)流服務(wù)”UserStream負(fù)責(zé)用戶登錄態(tài)、權(quán)限、基本信息、DataStream負(fù)責(zé)主業(yè)務(wù)數(shù)據(jù)的加載、刷新、分頁(yè)、UIEventStream負(fù)責(zé)將用戶交互事件標(biāo)準(zhǔn)化為統(tǒng)一格式。每個(gè)服務(wù)都是一個(gè)獨(dú)立的 Observable它們之間通過(guò) pipe 操作符連接形成數(shù)據(jù)管道。UI 組件只負(fù)責(zé)“訂閱”這些流并將最新值映射到 JSX。這樣做的好處是測(cè)試變得極其簡(jiǎn)單你不需要啟動(dòng)整個(gè) React 應(yīng)用只需要給 UserStream 一個(gè)模擬的登錄響應(yīng)然后斷言它 emit 的用戶對(duì)象是否符合預(yù)期給 DataStream 一個(gè)模擬的網(wǎng)絡(luò)延遲然后斷言它是否在超時(shí)后正確地 emit 了錯(cuò)誤。我指導(dǎo)過(guò)一位剛轉(zhuǎn)前端的后端工程師他習(xí)慣寫(xiě)單元測(cè)試但面對(duì) React 組件測(cè)試總是抓狂。當(dāng)他把業(yè)務(wù)邏輯全部抽離到 RxJS 流中后他寫(xiě)的第一個(gè)測(cè)試用例是expect(firstValueFrom(userStream$)).resolves.toEqual({ id: 1, name: test })。一行代碼覆蓋了從 token 解析、API 調(diào)用、數(shù)據(jù)格式化到錯(cuò)誤兜底的全部路徑。這才是工程化的起點(diǎn)。RxJS 不是讓你拋棄 React而是讓你能把 React 用得更純粹、更專(zhuān)注、更可測(cè)試。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)從一個(gè)搜索框看透 Observable 的五大生命階段3.1 Observable 的本質(zhì)一個(gè)“懶加載的、可取消的函數(shù)”不是數(shù)據(jù)容器這是理解 RxJS 最關(guān)鍵的第一步也是絕大多數(shù)初學(xué)者卡殼的地方。網(wǎng)上很多教程一上來(lái)就說(shuō)“Observable 是一個(gè)數(shù)據(jù)流”這容易讓人聯(lián)想到“數(shù)組”或“隊(duì)列”從而產(chǎn)生巨大誤解。實(shí)際上Observable 更像一個(gè)“菜譜”它本身不包含任何菜數(shù)據(jù)它只描述了“怎么做這道菜”的完整步驟——從買(mǎi)什么菜創(chuàng)建源、怎么切map、要不要焯水filter、火候多大debounceTime、最后擺盤(pán)subscribe。只有當(dāng)你“開(kāi)始做飯”調(diào)用 subscribe()這個(gè)菜譜才真正被執(zhí)行食材數(shù)據(jù)才開(kāi)始流動(dòng)。這個(gè)“懶加載”特性至關(guān)重要。比如你定義了一個(gè)const apiStream$ of(hello).pipe(delay(5000))它并不會(huì)在定義時(shí)就等 5 秒而是在你調(diào)用apiStream$.subscribe(...)的那一刻才開(kāi)始計(jì)時(shí)。這意味著你可以安全地在應(yīng)用啟動(dòng)時(shí)就定義好所有數(shù)據(jù)流而不用擔(dān)心它們會(huì)立刻發(fā)起網(wǎng)絡(luò)請(qǐng)求或消耗資源。另一個(gè)關(guān)鍵點(diǎn)是“可取消”。當(dāng)你調(diào)用const sub stream$.subscribe(...)返回的sub是一個(gè) Subscription 對(duì)象調(diào)用sub.unsubscribe()就能立即終止這個(gè)流的所有后續(xù)執(zhí)行。這解決了 useEffect 中最頭疼的“清理函數(shù)”問(wèn)題。在 useEffect 里你必須手動(dòng)寫(xiě)return () { controller.abort() }稍有不慎就會(huì)忘記導(dǎo)致內(nèi)存泄漏。而在 RxJS 里只要你在組件卸載時(shí)調(diào)用subscription.unsubscribe()所有由這個(gè)流觸發(fā)的定時(shí)器、網(wǎng)絡(luò)請(qǐng)求、事件監(jiān)聽(tīng)都會(huì)被自動(dòng)清理。我曾經(jīng)在一個(gè)地圖應(yīng)用中用fromEvent(map, click)監(jiān)聽(tīng)地圖點(diǎn)擊結(jié)果忘了取消訂閱用戶切換頁(yè)面后點(diǎn)擊事件還在后臺(tái)默默執(zhí)行導(dǎo)致地圖坐標(biāo)錯(cuò)亂。換成const clickStream$ fromEvent(map, click).pipe(takeUntil(componentDestroyed$))問(wèn)題瞬間消失。takeUntil 是一個(gè)操作符它監(jiān)聽(tīng)另一個(gè)流componentDestroyed$一旦那個(gè)流 emit 一個(gè)值它就自動(dòng)取消自己。這種聲明式的清理比手寫(xiě) return 函數(shù)可靠得多。3.2 五大生命階段詳解從創(chuàng)建、訂閱、發(fā)射、錯(cuò)誤到完成一個(gè)都不能少一個(gè) Observable 的完整生命周期可以被清晰地劃分為五個(gè)階段每個(gè)階段都有其對(duì)應(yīng)的鉤子和操作符。理解它們是寫(xiě)出健壯流式代碼的基礎(chǔ)。第一階段創(chuàng)建Creation這是流的源頭決定了數(shù)據(jù)從哪里來(lái)。RxJS 提供了豐富的創(chuàng)建函數(shù)of(...values)把一串靜態(tài)值變成流of(1, 2, 3)會(huì)依次 emit 1, 2, 3。from(iterable)把數(shù)組、Promise、甚至 generator 函數(shù)轉(zhuǎn)為流。from(fetch(/api/data))會(huì)把 Promise 的 resolve/reject 轉(zhuǎn)為 emit/error。fromEvent(target, eventName)把 DOM 事件轉(zhuǎn)為流這是前端最常用的創(chuàng)建方式。interval(period)/timer(due, period)創(chuàng)建定時(shí)器流interval(1000)每秒 emit 一個(gè)遞增數(shù)字。new Observable(subscriber { ... })最底層的手動(dòng)創(chuàng)建你可以完全控制何時(shí) emit、何時(shí) error、何時(shí) complete。第二階段訂閱Subscription這是流的“啟動(dòng)按鈕”。調(diào)用stream$.subscribe(observer)或stream$.subscribe(next, error, complete)流才開(kāi)始執(zhí)行。這里有個(gè)重要原則每個(gè) subscribe 都會(huì)創(chuàng)建一個(gè)獨(dú)立的執(zhí)行上下文。比如const stream$ of(1).pipe(delay(1000)); stream$.subscribe(console.log); stream$.subscribe(console.log);會(huì)輸出兩次1且兩次都是在 1 秒后。它們不是共享同一個(gè)延遲而是各自創(chuàng)建了一個(gè)新的延遲實(shí)例。這解釋了為什么你需要shareReplay(1)這樣的操作符來(lái)實(shí)現(xiàn)“多播”——讓多個(gè)訂閱者共享同一個(gè)執(zhí)行結(jié)果。第三階段發(fā)射Emission這是流的核心工作。通過(guò)subscriber.next(value)向下游推送數(shù)據(jù)。注意next 是一個(gè)函數(shù)不是事件。你可以在任意位置、任意條件下調(diào)用它比如在一個(gè) for 循環(huán)里或者在一個(gè) if 判斷里。這給了你極大的靈活性。例如你想實(shí)現(xiàn)一個(gè)“搜索建議”當(dāng)輸入為空時(shí)不發(fā)請(qǐng)求直接 emit 一個(gè)空數(shù)組input$.pipe( switchMap(query query.trim() ? of([]) : ajax(/search?q${query}) ) )。這里of([])就是一個(gè)“發(fā)射空數(shù)組”的流。第四階段錯(cuò)誤Error通過(guò)subscriber.error(err)發(fā)送錯(cuò)誤。這會(huì)立即終止流且不會(huì)觸發(fā) complete。錯(cuò)誤處理是 RxJS 的強(qiáng)項(xiàng)。catchError操作符可以捕獲上游的 error并返回一個(gè)新的流來(lái)“兜底”ajax(/api/data).pipe(catchError(err of([])))網(wǎng)絡(luò)失敗時(shí)就 emit 一個(gè)空數(shù)組UI 層無(wú)需額外判斷。更強(qiáng)大的是retry({ count: 3, delay: 1000 })它會(huì)在錯(cuò)誤后等待 1 秒然后重試最多 3 次。第五階段完成Completion通過(guò)subscriber.complete()結(jié)束流。這表示“此流不會(huì)再有新數(shù)據(jù)了”。一個(gè) completed 的流其訂閱者會(huì)收到 complete 回調(diào)。這對(duì)于資源清理非常有用。比如一個(gè)fromEvent(button, click)流理論上永遠(yuǎn)不會(huì) complete因?yàn)樗鼤?huì)一直監(jiān)聽(tīng)點(diǎn)擊。但如果你加上take(1)它就會(huì)在第一次點(diǎn)擊后自動(dòng) complete。finalize(() console.log(流已結(jié)束))操作符會(huì)在流無(wú)論以何種方式next、error、complete結(jié)束時(shí)執(zhí)行一段清理代碼這是比 unsubscribe 更上層的鉤子。3.3 關(guān)鍵操作符實(shí)戰(zhàn)防抖、節(jié)流、切換、合并一個(gè)搜索框里的戰(zhàn)爭(zhēng)讓我們用一個(gè)真實(shí)的搜索框需求把上面的理論全部串起來(lái)。需求如下用戶在輸入框中輸入輸入停止 300ms 后發(fā)起搜索請(qǐng)求如果在請(qǐng)求過(guò)程中用戶又輸入了新內(nèi)容則取消上一個(gè)請(qǐng)求只處理最新的請(qǐng)求成功顯示結(jié)果失敗顯示錯(cuò)誤提示用戶清空輸入框顯示空結(jié)果。// 1. 創(chuàng)建輸入流監(jiān)聽(tīng) input 事件并提取 value const input$ fromEventHTMLInputElement(inputElement, input).pipe( map(event event.target.value), // 2. 防抖等待 300ms期間有新輸入則重置計(jì)時(shí)器 debounceTime(300), // 3. 過(guò)濾去掉空字符串和純空格 filter(value value.trim().length 0), // 4. 去重如果連續(xù)兩次輸入相同內(nèi)容只處理一次 distinctUntilChanged() ); // 5. 創(chuàng)建搜索流將輸入流映射為 API 請(qǐng)求流 const searchResults$ input$.pipe( // switchMap 是核心它會(huì)自動(dòng)取消前一個(gè)未完成的 inner observable switchMap(query ajax({ url: /api/search?q${encodeURIComponent(query)}, method: GET, // 6. 添加 abort signal確保 switchMap 能真正取消請(qǐng)求 headers: { Content-Type: application/json } }).pipe( // 7. 成功時(shí)提取 response.data map(response response.response), // 8. 失敗時(shí)返回一個(gè)友好的錯(cuò)誤對(duì)象 catchError(error of({ error: true, message: 搜索失敗請(qǐng)重試 })) ) ), // 9. 默認(rèn)值如果 input$ 完成比如組件卸載提供一個(gè)默認(rèn)空數(shù)組 startWith([] as SearchResult[]) ); // 10. 訂閱將結(jié)果綁定到 UI const subscription searchResults$.subscribe({ next: (results) { // 更新 UI顯示 results renderResults(results); }, error: (err) { // 這里理論上不會(huì)觸發(fā)因?yàn)?catchError 已經(jīng)處理了 console.error(流自身出錯(cuò):, err); }, complete: () { console.log(搜索流已完成); } }); // 11. 清理組件卸載時(shí)取消訂閱 return () subscription.unsubscribe();這段代碼里switchMap是靈魂。它確保了“永遠(yuǎn)只處理最新的搜索請(qǐng)求”。debounceTime解決了高頻輸入問(wèn)題。catchError讓錯(cuò)誤處理變得聲明式。startWith確保了 UI 在初始狀態(tài)下就有數(shù)據(jù)可渲染避免了“閃白屏”。整個(gè)邏輯沒(méi)有一行是關(guān)于“l(fā)oading 狀態(tài)”的手動(dòng)管理因?yàn)?loading 狀態(tài)本身就是流的一個(gè)中間態(tài)當(dāng)switchMap正在等待 inner observableajax完成時(shí)UI 就處于 loading當(dāng)它 emit 了結(jié)果loading 自動(dòng)結(jié)束。這就是流式編程的魅力——狀態(tài)是數(shù)據(jù)流動(dòng)的副產(chǎn)品而不是你需要手動(dòng)維護(hù)的變量。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)從零搭建一個(gè)可復(fù)用的“用戶信息流服務(wù)”4.1 項(xiàng)目初始化與依賴(lài)安裝輕量起步按需引入RxJS 的包體積曾是很多人的顧慮但 v7 版本已經(jīng)做了極致的 tree-shaking 優(yōu)化。你不需要引入整個(gè)庫(kù)只需要按需導(dǎo)入你用到的操作符和創(chuàng)建函數(shù)。推薦使用以下方式初始化# 使用 npm npm install rxjs # 或使用 pnpm更推薦依賴(lài)管理更干凈 pnpm add rxjs在 TypeScript 項(xiàng)目中確保你的tsconfig.json包含lib: [ES2015, DOM]因?yàn)?RxJS 依賴(lài) ES2015 的 Promise 和 DOM API。接下來(lái)不要在全局 import * as rxjs from rxjs而是采用“按需導(dǎo)入”模式這能將最終打包體積控制在 KB 級(jí)別// ? 正確只導(dǎo)入你需要的 import { fromEvent, interval, of } from rxjs; import { map, filter, debounceTime, switchMap, catchError, retry } from rxjs/operators; // ? 錯(cuò)誤導(dǎo)入整個(gè)庫(kù)體積爆炸 // import * as rxjs from rxjs; // import rxjs/add/operator/map;RxJS 的操作符現(xiàn)在是純函數(shù)不再是掛載在 Observable.prototype 上的方法那是 v5 的舊語(yǔ)法所以你必須用pipe()來(lái)組合它們。這是一個(gè)巨大的進(jìn)步因?yàn)樗岊?lèi)型推導(dǎo)更加準(zhǔn)確也讓 tree-shaking 更加徹底。我曾經(jīng)幫一個(gè)電商項(xiàng)目做性能審計(jì)發(fā)現(xiàn)他們打包后的 rxjs 占了 120KB。通過(guò)將所有import rxjs/add/operator/*替換為import { map, filter } from rxjs/operators并確保 Webpack 配置開(kāi)啟了mode: production最終 rxjs 體積降到了 18KB。這證明了RxJS 的體積問(wèn)題從來(lái)不是庫(kù)本身的問(wèn)題而是使用方式的問(wèn)題。4.2 構(gòu)建 UserStream 服務(wù)一個(gè)完整的、可測(cè)試的用戶數(shù)據(jù)流我們來(lái)構(gòu)建一個(gè)生產(chǎn)環(huán)境可用的UserStream服務(wù)。它需要處理用戶登錄態(tài)檢查、token 刷新、用戶信息拉取、錯(cuò)誤重試、離線降級(jí)。我們將它設(shè)計(jì)為一個(gè)獨(dú)立的、可注入的類(lèi)方便在 React、Vue 或純 JS 項(xiàng)目中復(fù)用。// user-stream.service.ts import { Injectable } from angular/core; // 如果是 Angular 項(xiàng)目 // 或者對(duì)于純 TS 項(xiàng)目直接 export class import { BehaviorSubject, Observable, of, throwError, timer, merge, EMPTY } from rxjs; import { map, filter, switchMap, catchError, retry, shareReplay, startWith, distinctUntilChanged, take, finalize } from rxjs/operators; // 定義用戶類(lèi)型 interface User { id: string; name: string; email: string; avatar: string; } // 定義錯(cuò)誤類(lèi)型 interface ApiError { status: number; message: string; } // 模擬 API 服務(wù) class ApiService { // 模擬獲取用戶信息 getUserInfo(token: string): ObservableUser { return new ObservableUser(subscriber { // 模擬網(wǎng)絡(luò)請(qǐng)求 const xhr new XMLHttpRequest(); xhr.open(GET, /api/user?token${token}); xhr.onload () { if (xhr.status 200 xhr.status 300) { try { const user JSON.parse(xhr.responseText) as User; subscriber.next(user); subscriber.complete(); } catch (e) { subscriber.error({ status: 500, message: 解析失敗 }); } } else { subscriber.error({ status: xhr.status, message: xhr.statusText }); } }; xhr.onerror () { subscriber.error({ status: 0, message: 網(wǎng)絡(luò)錯(cuò)誤 }); }; xhr.send(); }); } // 模擬刷新 token refreshToken(refreshToken: string): Observable{ token: string; expires: number } { return of({ token: new-token, expires: Date.now() 3600000 }); } } Injectable() export class UserStreamService { private apiService new ApiService(); // 1. 創(chuàng)建一個(gè)行為主題BehaviorSubject用于存儲(chǔ)當(dāng)前用戶狀態(tài) // 它會(huì)記住最新的值并在新訂閱者加入時(shí)立即發(fā)送 private currentUserSubject new BehaviorSubjectUser | null(null); public currentUser$: ObservableUser | null this.currentUserSubject.asObservable().pipe( // 確保只在用戶對(duì)象真正改變時(shí)才通知避免引用相等但內(nèi)容不同的假更新 distinctUntilChanged((a, b) JSON.stringify(a) JSON.stringify(b)) ); // 2. 創(chuàng)建一個(gè)“用戶是否已認(rèn)證”的流 public isAuthenticated$: Observableboolean this.currentUser$.pipe( map(user !!user), distinctUntilChanged() ); // 3. 初始化流在服務(wù)創(chuàng)建時(shí)嘗試從 localStorage 加載 token 并拉取用戶信息 private initStream$: Observablevoid this.loadTokenFromStorage().pipe( switchMap(token { if (!token) { // 沒(méi)有 token用戶未登錄 this.currentUserSubject.next(null); return of(undefined); } // 有 token嘗試?yán)∮脩粜畔?return this.fetchUserInfo(token).pipe( catchError(err { // 如果拉取失敗嘗試刷新 token return this.refreshToken(token).pipe( switchMap(newToken this.fetchUserInfo(newToken.token)), catchError(refreshErr { // 刷新也失敗了清除本地 token視為未登錄 localStorage.removeItem(auth_token); this.currentUserSubject.next(null); return throwError(refreshErr); }) ); }) ); }), // 無(wú)論成功失敗都標(biāo)記初始化完成 finalize(() console.log(UserStream 初始化完成)) ); constructor() { // 立即啟動(dòng)初始化流 this.initStream$.subscribe({ next: () {}, error: (err) console.error(初始化失敗:, err) }); } // 4. 公共方法登錄 login(credentials: { username: string; password: string }): ObservableUser { // 模擬登錄 API return of({ id: 1, name: Test User, email: testexample.com, avatar: }).pipe( tap(user { // 登錄成功保存 token此處簡(jiǎn)化 localStorage.setItem(auth_token, login-token); this.currentUserSubject.next(user); }) ); } // 5. 公共方法登出 logout(): void { localStorage.removeItem(auth_token); this.currentUserSubject.next(null); } // 6. 私有方法從 storage 加載 token private loadTokenFromStorage(): Observablestring | null { return of(localStorage.getItem(auth_token)); } // 7. 私有方法拉取用戶信息 private fetchUserInfo(token: string): ObservableUser { return this.apiService.getUserInfo(token).pipe( // 成功時(shí)更新?tīng)顟B(tài) tap(user this.currentUserSubject.next(user)), // 失敗時(shí)重試 2 次每次間隔 1 秒 retry({ count: 2, delay: 1000 }), catchError(err { console.error(獲取用戶信息失敗:, err); // 降級(jí)返回一個(gè)空用戶對(duì)象避免 UI 崩潰 this.currentUserSubject.next(null); return throwError(err); }) ); } // 8. 私有方法刷新 token private refreshToken(token: string): Observable{ token: string; expires: number } { return this.apiService.refreshToken(token).pipe( tap(newToken { localStorage.setItem(auth_token, newToken.token); }) ); } }這個(gè)UserStreamService展示了 RxJS 在真實(shí)項(xiàng)目中的威力BehaviorSubject提供了“當(dāng)前狀態(tài)”的快照能力讓 UI 組件可以立即獲取到最新用戶信息而不需要等待流的首次 emit。switchMap在登錄、刷新 token 等場(chǎng)景下確保了“取消上一個(gè)未完成的請(qǐng)求”避免了競(jìng)態(tài)條件。retry內(nèi)置了指數(shù)退避重試邏輯比手寫(xiě)setTimeouttry/catch清晰得多。tap用于執(zhí)行副作用如更新 localStorage而不改變流的數(shù)據(jù)。finalize在流結(jié)束時(shí)執(zhí)行清理保證日志記錄的完整性。4.3 在 React 中集成useObservable Hook讓 Hooks 與 RxJS 無(wú)縫銜接雖然 RxJS 是框架無(wú)關(guān)的但在 React 生態(tài)中我們需要一個(gè)優(yōu)雅的方式來(lái)“訂閱”流并將其值同步到組件狀態(tài)。useObservableHook 就是為此而生。它不是一個(gè)官方 Hook而是一個(gè)社區(qū)廣泛采用的、經(jīng)過(guò)充分驗(yàn)證的模式。// hooks/use-observable.ts import { useEffect, useState, useRef } from react; import { Observable, Subscription } from rxjs; /** * 一個(gè)自定義 Hook用于在 React 組件中安全地訂閱 Observable * param observable$ 要訂閱的 Observable * param initialValue 初始值在流 emit 第一個(gè)值之前使用 * returns 當(dāng)前值 */ export function useObservableT( observable$: ObservableT, initialValue: T ): T { const [value, setValue] useStateT(initialValue); const subscriptionRef useRefSubscription | null(null); useEffect(() { // 創(chuàng)建訂閱 subscriptionRef.current observable$.subscribe({ next: (val) setValue(val), error: (err) { console.error(Observable error in useObservable:, err); // 可以選擇拋出錯(cuò)誤讓 ErrorBoundary 捕獲 // throw err; } }); // 清理函數(shù)組件卸載時(shí)取消訂閱 return () { if (subscriptionRef.current) { subscriptionRef.current.unsubscribe(); } }; }, [observable$]); // 注意依賴(lài)數(shù)組只包含 observable$因?yàn)樗欠€(wěn)定的 return value; } // 使用示例 import React from react; import { useObservable } from ./hooks/use-observable; import { userStreamService } from ./services/user-stream.service; const UserProfile: React.FC () { // 直接訂閱服務(wù)暴露的流 const user useObservable(userStreamService.currentUser$, null); const isAuthenticated useObservable(userStreamService.isAuthenticated$, false); if (!isAuthenticated) { return div請(qǐng)先登錄/div; } return ( div h2歡迎回來(lái){user?.name}!/h2 img src{user?.avatar} altavatar / button onClick{userStreamService.logout}登出/button /div ); }; export default UserProfile;這個(gè)useObservableHook 的精妙之處在于它將 RxJS 的“訂閱-取消訂閱”生命周期完美地映射到了 React 的useEffect生命周期上。它使用useRef來(lái)存儲(chǔ) Subscription避免了在每次渲染時(shí)都創(chuàng)建新的訂閱這會(huì)導(dǎo)致內(nèi)存泄漏。它的依賴(lài)數(shù)組[observable$]是安全的因?yàn)閛bservable$本身是一個(gè)穩(wěn)定的引用它是一個(gè)常量流不是每次渲染都新建的。它允許你傳入initialValue這解決了流在首次 emit 前的“空狀態(tài)”問(wèn)題讓 UI 渲染更加平滑。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄那些年我在 RxJS 里踩過(guò)的坑5.1 “內(nèi)存泄漏”之謎為什么我的組件卸載了流還在發(fā)請(qǐng)求這是 RxJS 新手遇到的最高頻問(wèn)題。癥狀是切換頁(yè)面后控制臺(tái)依然能看到網(wǎng)絡(luò)請(qǐng)求發(fā)出或者定時(shí)器還在打印日志。根本原因只有一個(gè)你創(chuàng)建了訂閱但沒(méi)有在組件卸載時(shí)取消它。排查步驟找到所有調(diào)用了.subscribe()的地方。檢查這些地方是否都有對(duì)應(yīng)的unsubscribe()調(diào)用。特別注意fromEvent、interval、timer這些“永不 complete”的流它們必須被顯式取消。解決方案最佳實(shí)踐始終使用takeUntil操作符。創(chuàng)建一個(gè)destroy$流在組件卸載時(shí) emit 一個(gè)值// React 中 const destroy$ useRef(new Subjectvoid()).current; useEffect(() { const subscription someStream$.pipe( takeUntil(destroy$) ).subscribe(...); return () { destroy$.next(); // 觸發(fā) takeUntil subscription.unsubscribe(); }; }, []);避免在 useEffect 中直接調(diào)用 subscribe。這會(huì)讓清理邏輯變得復(fù)雜。優(yōu)先使用useObservable這樣的封裝 Hook。使用shareReplay(1)時(shí)要格外小心。它會(huì)緩存最后一個(gè)值并讓后續(xù)訂閱者立即收到。但如果原始流沒(méi)有被取消shareReplay會(huì)一直持有對(duì)它的引用導(dǎo)致內(nèi)存泄漏。務(wù)必確保上游流是可取消的。5.2 “Stale Closure”陷阱為什么我的流里用的 state 總是舊的這個(gè)問(wèn)題在 React 中尤為突出。你可能會(huì)寫(xiě)const [count, setCount] useState(0); useEffect(() { const sub interval(1000).pipe( map(() count) // ? 這里的 count 是閉包捕獲的初始值 ).subscribe(console.log); return () sub.unsubscribe(); }, []); // 依賴(lài)數(shù)組為空只運(yùn)行一次結(jié)果你會(huì)發(fā)現(xiàn)控制臺(tái)打印的永遠(yuǎn)是0而不是實(shí)時(shí)的count。原因useEffect的回調(diào)函數(shù)形成了一個(gè)閉包它捕獲了count在該次渲染時(shí)的值。而interval是一個(gè)長(zhǎng)生命周期的流它不會(huì)重新執(zhí)行map函數(shù)去讀取新的count。解決方案使用useObservableHook。它內(nèi)部會(huì)處理好依賴(lài)更新。將 state 轉(zhuǎn)為流。使用useRef存儲(chǔ)最新值并在流中通過(guò)ref.current讀取const countRef useRef(count); useEffect(() { countRef.current count; // 同步 ref }, [count]); const sub interval(1000).pipe( map(() countRef.current) // ? 讀取的是最新值 ).subscribe(...);使用combineLatest。把 state 和流合并const count$ useMemo(() of(count), [count]); const sub combineLatest([interval(1000), count$]).pipe( map(([_, c]) c) ).subscribe(...);5.3 “流不發(fā)射”之惑為什么我的 subscribe 什么都沒(méi)收到這通常有四個(gè)原因流是“冷”的你沒(méi)調(diào)用 subscribe。of(1,2,3)是冷流定義時(shí)不執(zhí)行必須subscribe才會(huì) emit。流在你訂閱前就已經(jīng) complete 或 error 了。比如of(1).pipe(delay(1000))如果你在定義后立刻subscribe會(huì)什么都收不到因?yàn)閐elay還沒(méi)到時(shí)間。此時(shí)應(yīng)該用shareReplay(1)緩存。操作符使用錯(cuò)誤。filter會(huì)過(guò)濾掉所有不滿足條件的值如果條件永遠(yuǎn)不滿足流就永遠(yuǎn)不 emit。take(0)會(huì)立即 complete不 emit 任何值。錯(cuò)誤被靜默吞掉了。catchError如果返回EMPTY或of()流會(huì)繼續(xù)但你可能沒(méi)注意到。務(wù)必在catchError里加日志??焖僭\斷表| 現(xiàn)象 | 最可能原因 | 快速驗(yàn)證方法 | |------|------------
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91丝袜在线观看| 色婷婷一区二区三区久久午夜成人不| 精精夜夜| 国产精品盗摄 偷窥盗摄| 欧美久久九九| A级毛片在线看免费| 久久超碰爱| 欧美色图 色综合图| 麻豆亚洲Av成人无码一区精品| 国产传媒日韩| 一区超碰一区| 91av天美性媒精品视频| 亚洲欧美日韩精品久久久一区二区 | 黑人娇小av在线播放| 女人天堂av在线播放| 是还免费视频1727我| 久久99人妖视频国产| 亚洲情色 自拍| 日韩伦理久 久久 清纯| 先锋色眉乱伦资源| 国产精品操| 大色网久久| 4141514逼喷水三级片| 国产精品美女在线一区| 欧美真人抽搐一进一出gif| 亚州春色| 日本三级韩国三级99| 日本中文熟女视频| 亚洲 中文 欧美 日韩 在线 | 亚洲欧美黄| 啊啊啊啊在线观看网址| 大香蕉日韩欧美| 大香蕉青青9| Julia Annxxxxx| 色色婷婷丁香| 亚洲高清在线| 搡老女人老妇女AAA一VU麻豆| 躁躁躁日日躁2020| 日韩欧美中文字| 久久精品一区二区三区不卡| A V少妇特黄三级| 性在久久久久久| 久久黄片国产一区二区| 日韩精品-原创伙伴| 美女爽爽爽刺痛洞洞| 清纯唯美激情四射| 青青草在线视频欧美| 97 国产一区| 欧美亚洲丝袜美女电影| 亚熟在线| 亚洲97资源| 在线五区| 久久男人的天堂| 91国产丝袜白虎| 91色图片| 色性荡荡荡荡视频| 96久久久精品| 伊人骚琪琪亚洲天堂网站| 欧美的精品的视频| 亚洲不雅视频1区二区| 精品人妻一区二区三区在| 欧美A片中文字幕| 人妻 中文 日韩| 久久久无码av精| 91性高朝久久久久久久久| 精品人妻av区天天看片| 国产熟女完整版中字| 91干熟女| 亚洲男人天堂Av| 欧美日韩人人精品| 日韩 女同 综合| 天干天干天干天天做| 9久精品| 久久精品日韩| 天天色综合天天操| 97干天天| 中文字幕欧美精品亚洲日韩蜜臀| 黄色激情电影在线观看| 免费看欧美美女黄色大片 | 日韩不卡码| 在线观看中文av字幕| 精品视频久久久久九九九九9999| 青青伊人久久| 97色色国产视频| 国产精品亚洲四五区在线观看| 九九精品美女高溯喷水| 亚洲成人AB| 国产91亚洲精品一区二区三区| 亚洲av噜噜噜噜噜噜| 丁香婷婷五月| 丝袜天堂| 91老熟女视频| 日日狠狠久久偷偷色综合免费| 神马久久69| 亚洲天堂美臀在线| 亚洲h片在线免费观看| 精品一区二区三区蜜桃臀赵总| 人妻少妇精品久久久| 97亚洲在线| 美女国产一区二区久久| 婷婷日韩一区二区三区中文字幕在线| 99这里都是精品| 84YTCOM性无码| 在线国产一区二区av| 中美日韩毛片| 欧美岛国精品在线观看| 美女露胸露尿口| 亚欧洲日韩国产精品| 激情接吻视频久久久久久| 亚洲欧洲自拍| 色穴精品| 中日韩免费看男女操逼大全| 久久婷婷国产一区二区色| 久久国产对白激情浪潮 | 欧美色亚洲| 狠狠色丁香| 中文字幕一二三区| 人人看人人爰人人操| 欧美精品在线观看| a亚洲欧美色欲| 国产999精品久久久久久| 欧美97网| 少妇被玩视频二三区| 99999精品| 亚洲熟女国产综合另类| 乱性AV| 动漫片子网站3黄| 亚欧色图在线激情| 1区2区3区中文字幕日韩| 被男人吃奶很爽的毛片| 欧美激情久| 国产色精品午夜大片| 2019亚洲男人天堂| 久久久久久久久久久久久9999| 热热色91| 蜜臀一二三| 啪一啪免费视频| 大香蕉懂9| www激情| 人人妻人人爽| 五月丁香综合激情| 蜜臀久久久99久久久久| av一区二区三区 中文| 97超碰总站| 亚洲综合中文字幕有码| 国产辣妈在线视频福利| 一本色道久久综合亚洲二区三区| 久久久免费的精品| 99热在线观看| 久久久久久免费电影| 欧美激情综合色综合啪啪五月| 伊人9| 日本三级大片| 无码高清国产AV| 怡红院成人av| 丁香五月社区| 色就色综合| 人妻喷水| 精品人妻一区春色| 久久女人视频| 国产女人成人精品视频| 国产美女口爆吞精视频| 韩日欧亚a级| 欧美色图中文字幕| 免费A V在线| www国产无码| 欧美美女在线高潮999| 乱欲一区二区| 亚洲精品国产拍免费91在线| 国产乱弄免费在线视频。| 国产精品久久成人免费| 国产毛片毛片4p懂色| 操淫穴亚洲五月丁香| 国语人妻精彩刺激| 人妻天堂综合网| 欧美一级久久久久久久大片动画 | 岛国毛片在线观看免费| av网站免费看| 这里都是精品| 激情文学小说一区二区 | 92一区二区| 婷婷九月国产| 九九热超碰97亚洲最新香蕉| 欧美亚洲日韩人妻在线观看| 亚洲精品第一| 色色色欧美| 国产中午字一暮区| 少妇人妻精品| 欧美操逼视频二区| 九九精品美女高溯喷水| 五月天激情小说网| 91人人臊| 天天天天干| 国产版a级片直播在线| 黑人精品一区二区在线播放| 国产精品精品系列在线观看| 性色A∨91| 欧美色91| 9久久久久久| 激情婷婷丁香| 精品9999| 欧美激情内射| 中文字幕欧美丝袜07资源| 精品国产a∨一区天美传媒| 久草精品一区| 中文字幕精品亚洲熟女| 99操逼| 青青草原香蕉日本Ap| 欧美第二页午夜| 亚洲欧美setu| 午夜精品人妻二区三区| 亚洲国产日韩精品久久久| 久久久三区二区一区| 91女优在线观看| 九九国产热| 日本一天色道久久久精品视频| 男人的天堂色偷偷青青草视频婷婷网| 性感美女啊啊啊在线| 成人天天爽| 熟妇熟女一区二三区| 精品视频日日夜夜| 日欧美色| 欧美激情久久久久| 死我十八禁| 97超碰伊人| 欧亚日韩一区在线| 色哟哟综合| 精品欧美А∨无码黑人大荫蒂| 亚洲欧美综合区自拍另类| ..日韩av毛片精品久久久| 国产大陆天天艹| 操我无码| 精品久久久中文字幕不| 白嫩妹子国产骚| 婷婷丁香激情| 岛国片在线观看视频亚洲| 日本人妻A片成人免费看片| 狠狠干综合| 欧美极品女人的天堂| 宅男午夜在线视频| 中文有码9| 欧美综合自拍| 国产成人无码久久精品| 丝袜综合色图| 亚洲图片视频小说| 亚洲国产一级黄色视频| 天堂中文资源在线bt| 色玖玖| 欧美一区二区日韩传媒搭讪精品| 黑人干亚洲| 亚洲 欧美 色图| 啪啪视频亚洲第一| 人妻少妇精品一区二区三区| 日韩78m视频| 超碰在线97国产| 欧美激情亚洲| 亚洲AV无码翔田千里网站| 天天色播亚洲综合网站| 精品人妻二区三区| 五月天婷婷社区| 蜜臀一区二区三区在线 | 亚洲诱惑天堂| 久久透逼视频| 中文字幕在线播放2中文字幕在线观看2| 91国产丝袜足交精品视频| 人妻少妇无码| 国精精品无码一二三区水多多| 欧美性猛交美女自慰91| 久久9久久| 国产操伦| 97免费视频网| 东北少妇高潮zzzz| 久久99久久99精品免视看婷婷| 久久国产对白激情浪潮| 牛牛AV人人夜夜澡人人爽| 日本中文字幕在线视频| 中精品一区二区三区| 亚洲黄色视频在线观看视频| 国产午夜福利视频在线| 东京热一区二区中文字幕| 操逼操操操91| 久久网亚洲| 天天操天天射天天日| 国模限制级电影| 九九热三级片| 91爽啪| 超碰久超碰久| 大香蕉免费中文| 色欧美在线| 天天干天天操天天干天天操| 亚洲男人天堂视频| 极品尤物自安慰| 国产人妻一区二区三区欧美毛片| 三级特黄60分钟播放| 99天天超碰| 成人五级久久| 久久AV色| 国产视频一区二区免费| 中文有码9| 九九久久99| 中文三一区| 五月婷婷丁香| 五月天伊人网| av婷婷色网| 99久久精品国产系列| 九九视品黄色| 影音先锋每日最新资源在线观看 | 日本在线观看网址| 香港日本韩国人妇99www.wccm20| 三级特黄60分钟播放| 亚州中文字幕超碰97| 亚洲精品国产专区在线观看| 免费97视频| 亚洲精品影视老司机| 久操| 六月婷激情福利天堂69| 小视频国产| 欧美天天在线| 日产中文字幕2020| 性爱乱伦网址| 性综合网| 蜜桃一区二区三区| 志村玲子视频一区二区| 国产东北女人在线视频| 国产在线激情| 久久做97| www.色五月| 精品免费视频国产一区| 精品无码一区二区人妻久久蜜桃| 亚洲1区| 1769成人国产精品视频| 亚洲精品国产av天美传媒| 国产美女mm131爽爽爽爽| 狠日欧美| 欧美一区二区三区黄色影视| 亚洲综合色网| 国产精品久久久久久久黄无码| 欧美亚洲首页| 国产欧美后入| 97国产精品国| 一区二区娱乐网站| 精品美女少妇一区二区| 超碰国产情侣自拍网| 成人免费福利在线观看| 青娱乐欧美激情一区二区| 日韩本不卡视频在线观看| 国产黄色动态精品| 日本熟妇一区二区三区| 中国乱伦一区二区| 中文字幕丰满人妻日本| 97人人夜| 亚欧美综合网。| 丰满欧美少妇| 另类视频在线| A片 AV一级在线播放观看免费| 91天天| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 亚洲色图久久成人| www.夜夜操| 乱伦图av| 亚洲自拍天堂| AV和黑人在线播放| 天堂69亚洲精品中文字| 天天躁日日躁狠狠躁| 国产精品一区在线播放| 公司1区2区3区精产精| 另类av天堂| 韩国一区二区精品亚洲| 蜜臀国产AV中文字幕| 99热只有这里有精品| 亚洲精品性爱片| 欧美性爱精品七区| 大肥女高潮bbwbbwhd视频| 99少妇| 88在线一区二区三区| 亚洲成人妻日韩在线| 97色论| 97青青操视频| a男人的天堂| 色香色香欲天天天影视综合网| 久9视频| 国模吧 一区二区三区| 国产精品一级特黄aaa大片在线观看| 国产强奸AV在线| 九九九九9999| 日本久久女同性恋视频| 日本人妻中文字幕 | 亚洲熟久久| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 久久噜噜噜精品国产亚洲综合| 亚洲国内精品成人不卡| 亚欧操逼片在线观看| 欧美日本视频一区| 啊啊啊啊好爽好舒服一区二区易域| 欧美性少妇| 欧美性色欧美| 少妇熟女1区2区3区| 欧美精品久久96人妻无码| 综合伊人网12色| 国产男女边吃边摸视频网站| 欧美性爱三区二区| 婷婷丁香在线| 婷婷情色综合网| 无码一区二区三区四区五区六区七区八区九区十区视频 | 久久国产视频性吧 | 青青草依人大香蕉| 国产精品白领在线观看| 国产精品原创巨作?v网站| 日本欧美韩国国产在线| 久久久精品视频免费观看| 婷婷伊人网| 亚洲 综合 欧美| 日日橹狠狠爱欧美超碰| Aa东京男人的天堂| 人妻丝袜一区二区三区在线| 日韩在线欧美精品一区二区| 无码高清专| 三级三级三级日本99| 少妇与黑人高潮在线| 欧美在线中M| 日韩本不卡视频在线观看| 97操| 国产亚州精品美女久久久免费| 开心激情站| 国产小炒后入式| av影院十区| 久久精品一区二区一8| 狠狠色狠狠色狠狠五月| 9久超碰| 97色妞| 天天射日日干| 强奸乱亚洲| 亚洲综合影片| 老妇女91| 成人三级片无码| 91最新综合| 天美传媒精品久久视频| 欧美一区二区福利在线| 国产精品情侣啪啪| 玖玖无码超碰| 日韩国产成人自拍视频| 日本精品国产视频| 亚洲无 码A片在线观看麻豆| 国产欧美亚洲精品a第2页| 夜夜狼人妻| 欧美成97爱| 久久精品国产亚洲AV片多多| 精品无人区麻豆乱码久久久| 啊啊啊爽爽| 久久久国产成人一区二区三区在线| 欧美日本久久精品一区| 无码人妻精品酒店| 五月天大香蕉| 熟女久久| 亚洲码专区| 亚洲综合夜色| 性开放中文AV高清无码免费看| 天天日日本| 91肉片| 欧美后进式| 97爱爱官网| 亚洲欧美日韩精品久| 久草婷婷| 欧美 日韩 亚洲 春色| 亚洲日本男人天堂网| 日韩一级二级三级在线不卡观看完整| 久久久久久久久久8888| 久久伊人最新网址视频| 欧美一级黄片免费播放| 男人的天堂欧美| 欧美一级黄色18片免费看| 91无遮挡| 综合 亚洲 欧美| 蜜桃av综合网发布| 高清孕妇孕交 交孕妇| 欧美aaaaaaa| 97一区二区三区视频| 飘花国产午夜精品不卡| 男人久久精品| www国产天美久久久| 99久久9| 国产高清在线观看欧美| 日本精品久久久久久久| 综合久久六月久久婷婷| 欧美性五月| 亚洲操操操| 亚洲丝袜综合| 日韩av色图综合| 日韩亚洲精品一区二区| 国产精品乱码久久久久久久| 在线性黄高清免费视频| 亚洲日韩精品一区二区| 亚洲综合图文| 操比国产| 丁香色狠狠色综合久久小说| 久久久久密臀一区二区| 在线人人人人人人精品超| 国产嫩草精品A88AV| 中文字幕啊啊啊在线观看视频| 男人的天堂va在线| 91成人国产综合久久精品蜜月| 国产亚洲中文不卡二区| 午夜啊啊| 福利一级版子| 激情综合网激情五月天| 欧美性爱日韩高清| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 香蕉黄色一级视频| 久久久久久久久久久精| 少妇同性| 婷婷五月成人| 丁香六月激情| 狠狠超| 97网址97| 9久久9综合| 日本性爱不卡视频| 日本操逼aaaaa| 日日AAvv| 国产二区三区粉嫩在线| 国产女人高潮视频| 乱伦AVxx| AV麻豆免费一区| 熟女熟妇一区二区三区视频| 宅男91视频在线播放| 久久人人爽爽人人爽人人片αV| 国语少妇精| 学生妹天天看| 日韩国产十八禁| 嗯啊不要在线| 天天操天天舔| 亚洲欧美在线观看免费| 久久久久亚洲熟妇熟女| 超碰97亚洲| 午夜操一视频一区| 校园春色欧美| 美女AV一区二区| 91女人的网站| 色婷婷激情| 午夜福利视频在线一区| 国产av强奸美女| 久久综合九色综合欧洲98| 色网亚洲人| 自拍亚洲综合| 亚洲男人综合网| 97人人爱人人做人人乐| 日本淫色网| 亚洲精品视频二区| 92福利社视频| 五月婷婷五月天| 青娱乐日韩无码| 人人插人人摸人人| 伊人五月天激情| 18禁中文字幕| 少妇啪啪自拍| 丰满人妻一区二区三区四区| 都市久久精品激情亚洲| 91久久免费视频互動交流| 成人精品无码| 家庭乱伦国产精品| 很很操在线| 免费人成毛片乱码| av网站国产主播在线| 91麻豆天美| 日韩欧无码一区二区三区免费不卡| 亚洲国产综合图区中文字幕 | 欧美激情视频一区二区三区不卡| 欧美日韩高潮喷水91| 欧美天天拍| 91暧暧| 国产精品91ai| 操91| 91性网| 亚洲爽图| 人妻丰满熟妇一区二区三| 一级片在线观看高清无码| 视频在线观看免费一区二区三区| 三级网色| 日韩精品 资源| 久久久噜噜噜久久久| 国产又大又粗又长视频在线| 都市激情人妻一区二区青青操视频| 亚洲老司机123专区| 毛片99-全集电影手机免费观看完整-B029AV| 99这里都是精品| 好涩综合| 国产三级在线现体验区| 国产AV无码AV| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 四虎免费视频| 亚洲色欧美| 久久这里是精品| 久久久久久AV无码免费网站| 在现视频女上位好爽| 香港日本韩国人妇99www.wccm20| 久热网| 69视频入口| 操逼操网| 麻豆av一区二区三区| 中文字幕伊人| 97啪啪| 一级久久久久久久久久久| 天综合网| AV在线播放网址| 激情婷婷综合久久| 日本精品不卡一二三区| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 97se亚洲| 久久黄色性爱视频| 超碰97欧美在线| 色婷婷一区二区三区久久午夜| 最近二区三区视频大全| 99久久精品无码一区二区| 国产欧美伊人| 91麻豆天美国产欧美高潮| 欧美夜夜草视频| 大香蕉啪啪啪| 综合性视频99| 免费一级性爱久久| 麻豆天美国美国产| 中出20p| 色翁荡息又大又硬又粗又爽| 精品久久久九九九孕妇| 精品在线78| 综合欧美激情网| 美女淫穴| 2017av无码免费无线播| 欧美后进式| 在线洲亚线| 丁香六月东京热| 亚洲第91页 | 亚洲日韩av一区二区三区百合| 骚鸭AV| 欧美日本国产日韩激情视频| 日逼五月天| 日韩欧美亚洲自拍偷拍| 台湾佬激情综合| 大香蕉中文在线| 色综合色色| 999色欧美中文字幕| 围产精品一区二区三区视频播放| 蜜臀久久99精品| 黄片免费视频2019| 久久曰曰| 激情抓乳插进去啪啪啪日韩 | 色吧 综合| 亚洲天堂性爱| 大香蕉78| 怡红院怡春院| 综合av社区| 91中文精品日韩欧美在线| 日本国产亚洲一区在线观看| 日韩二三区| 亚洲AV成人无码一二三久久| 2019AV天堂| 人人玩人人添人人澡免费| 国产精品 午夜福利| 18禁在线视频| 国产精品久久久久久久免牛肉蒲团 | 人人爱操| 97超碰超碰| 欧洲射精91| 涩涩涩综合| 欲色啪| 免费看日本操逼视频| 亚洲精品国产拍免费91在线| 国产在线76页| 人妻无一区二区三区| 日韩电影天堂视频一区二区| 免费伦费视频在线观看| 国产丝袜一区二区三区| 欧美日韩丝袜| 亚洲无线码欧洲精品区别| 九九九九九九九九九九九九九九九女| 天天草天天干天天日| 99re视频这里只有精品| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 亚洲精品黄码久久久久| 尻女朋友一夜| 日韩欧美aⅴ综合网站发布| 中文字幕免费看| 九九无码| 91丨九色丨国产丨人妻在线| 中文字幕免费看| 密桃99999| 国产精品网址| 婷婷国产精品一区二区| 国产农村妇女精品一| 国产一级作爱毛片| 亚洲另类春色| 亚洲文学偷乱拍啪啪啪啪| 亚洲色五月| 国产精品国产自产高清AV| 久久久亚洲熟妇资源| xxx亚洲午夜天堂| 国产福利影视| 麻豆视频国产一区二区| 日韩成人人妻网站| 99九九久久| 伊人久久婷婷| 少妇人妻好深太紧了vr91| 欧美九九九| 98精品国产乱码久久久久久| 亚洲日韩一区电影| 玖玖资源综合在线视频| 亚洲无992tv| 中文字幕日韩情色| 四虎国产成人精品免费一女五男| 91欧美| 欧美黄片欧美黄片xxx| 日本不卡一区| 欧美成97爱| 亚洲综合伊人| 二级久久网| 91蜜臀在线久久久久| 偷窥自拍A片| 神马久久久久久伦理片| 亚洲人成网站7777| 欧美翘臀视频网站一区二区三区| 亚洲天堂资源| 老司机久久| 欧美丝袜激情| 中文字幕日产av人| 色蜜AV| 九九热精品| 激情五月天丁香社区| 国产成人午夜视频网址| 澳门黄片一香蕉视频| 啊啊啊啊操死我| 91色欧美| 99热精品在线观看| 亚洲在线A| 久久久国产护士丝袜美腿一| 亚洲涩涩| 97视频在线免费播放| 日韩啪啪啪视频| 国产盗摄美女如厕大神作品在线观看 | 豆1无夜无码| 亚洲无限观看| 91欧美性| 无卡一区=区| 热热色综合网| 高潮9999外国| 亚洲丝袜少妇在线| 亚州性9| 97视频在线播放| 日本成人在线不卡一区二区三区 | 啊啊啊不要好疼视频| 伊人AAA| 亚洲综合色男人网| 91在线美女| 性欧美天天| 九九拍拍精品视频在线播放| 老女人老91妇女老热女| 日产成人久久| 97在线免费公开视频| 97超级久久| 亚州欧美色图| 黄视频免费| AAAAAAAAA黄片| 中文字幕av乱伦| 五月丁香六月| 亚熟在线| 精品综合久久久久久97| 大香蕉伊人75| 很很操在线| 国产专区第一页| 亚欧性爱在线无码| 久久婷婷一区二| 久久久久久久久久久久黄色| 伊人色综合欧美| 黄色成年| 日本高清免费一本视频在线观看| 亚洲色 国产 欧美 日韩| 亚洲AV成人在线| 97干com| 加勒比AV天堂| 9丨久久九九九| 欧美区亚洲区偷拍区| 最新日产中文在线麻豆| 久久麻豆一区二区| 怡红院成人av| 97视频免费| 6080YYY午夜理论片在线观看| 久久精品亚洲成a人天堂| 96精品在线| 久久久久久久六六| 78久久| 国产精品无套内谢| 天天欧美欧美亚洲网| 97精品综合久久网| 亚洲情欲| 日本国产欧美高清在线| 麻豆视频test| 亚洲中文字幕久久无码精品| 国产午夜精品理论片一二三区区| 影音先锋中文字幕日本好一区二区| 天天综合色电影| 蜜桃臀AV在线| 中文字幕日韩精品久久| 久热这里| 综合色久欲| 6080YYY午夜理论片在线观看| 色色激情| 四虎在线免费视频| 天天视频网站黄| 色婷婷丁香五月| 欧洲一区二区三区四区在线观看| 国产肏逼网站| 激情自拍 校园春色| 久久久久久九九九九九九| 強姦亂倫a| 日韩乱码av| 97操碰| 色欲日韩欧美在线一区| 亚洲Av噜噜一区二区三区妖精| 亚州男人天堂| 99精品在线观看| 超碰在线综合97| 乱伦Av网| 伊人网在线视频| 国产乱伦性爱区| 艾草av| 国产精品999aaa| 亚洲精品男人的天堂| 午夜福利 成人 91| 全免费a敌肛交毛片免费| 你草精品在线视频| 亚洲 无码 偷拍| 情色日播放AV| 又大又大又大又粗爽高潮观看 | 国产后入| 精品.99999| 日本国产欧美一区三区二区| 色嘟嘟人妻天堂网| 91精品91久久久久77777俄罗斯老妇姓x| www.色操逼| 后入综合久久| 免费AV播放| 天堂性色| 色噜噜综合在线| 九九九九精品九九九九| 97精品国产97久久久久久免费| 东北熟女91| 97网址www| 老司机午夜精品视频| 亚洲激情 欧美色图| 92性色国产午夜福利在线661| 国产精品久久久蜜臀| 日韩中文字幕国产| 伊人991| 激情干在线| 好湿好紧视频| 亚洲 日韩 欧美 国产综合体| 欧美双插| 超碰97在线 欧美 国产| 最新亚洲人成网站在线影院| 欧美91精彩| 国产精品自拍欧美在线| 欧美色综合网| 久久久久久久久久久97| 免费日韩黄片| 五十路成人在线视频二区三区| 精品少妇一区二区三区在线视频| 91欧美经典| 蜜桃久久久久久久| 萌白酱自拍视频| 9精品久久久久| 久久9 9 9精品| 狠狠操官网| 日本 情色 1区2区3区| 日本天天操| 黄片免费视频2019| 久久女女| yirendaxiangjiashipin| 韩国一级AAA| www欧美91| 99re95| 超碰精品在线| 级做a爱无码性色永久免费| 欧美在线 亚洲| 国产玖玖| 激情国产乱伦Av| 国产97亚洲| 老女人老91妇女老热女| 激情五月天色播| 无码国产Av| 91精品国产一区三一| 干B| 亚洲不卡AV在线| 看一级特黄a大一片| 69一区二区三区| 欧洲精品区| 久久9久9久99久9久9| 精品伊人久久久大香线蕉小说| 无码国产精品96久久久久孕妇| 成人欧美日超碰| 超碰久久性爱| 亚洲欧洲综合视频在线| 久久久一区二区三区三州| 97中文字幕九区| 曰本91情色| 91精品国产综合久久久蜜臀| 熟妇操花| 精品高清一区二区三区三州| 亚洲欧美天堂| 精品女同一区二区三区| 天天内射| 久久只有精品一区二区三区| 农村妇女一级二级三级视频| 老司机射| 欧美性爱中文字幕无线码| 国产白丝精品在线观看| 欧美欧美少妇| 日1区2区3区2020| 天天草AV| 国产亚洲精品美女| 亚洲精品欧洲精品| 99999无码| 嗯嗯啊操我| 五月天激情婷婷| 97最新在线播放视频| 人妻系列无码专区中文有码| 翔田千里一区二区三区奶水| 日韩免费簧片| 中文字幕国产在线天堂| 熟女人妻一区二区三区免费看| 中文字幕一区二区三区四五区| 日本孕妇孕交| 加勒比伊人综合| 久久伊人青青草| 91夜色chaopeng| 97内射偷拍| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 欧美超碰人妻97| 久久久久亚洲精品| 麻豆婷婷成人一二三| 精品无码一区二区| 丰满人妻一区二区三区四| 九九热在线视频| www.婷婷五月天| 激情婷婷五月天| 丁香激情网| 91大学精品激情戏| 蜜桃久久一区二区三区| 国产又粗又又黄又猛| 密桃99999| 男人的天堂2019AV| 欧美制服网站美腿丝袜| AV天天综合| 91 国产丝袜在线放观看| 大香蕉伊人一区在线观看| 精品人妻一区二区免费蜜桃| 日日橹狠狠爱欧美超碰| 亚洲美女 晚间男人天堂 | 亚洲乱码国产乱码精网站| 操我无码| 欧洲色色| 夜夜高潮夜夜爽高清视频一| 精产国品一区二三产品| 黑人精品久久97| 欧美色图99| 欧美综合另类| 岛国片在线播放| 黄色av片三级三级三级免费看| 国产成人在线观看综合| 亚洲宅男天堂| 超碰午夜在线| 97视频新免费| 婷婷色香伊人| 人人摸.人人色| 5278欧美一区二区三区| 七久久久| 青青草成人视频在线观看二区| 国产后入清纯| 国产深喉视频一区二区| 蜜乳AV.COM| 精品超碰国产| 91最新综合| 色哟哟AV| 亚洲中文字幕熟女| 国产精品自在线发布| 天天日天天色| 97欧美日韩中文| 99999国产精品| a一区二区三区乱码在线| 精品一区二区成人动漫| 欧美熟妇精品黑人巨大一二三区| 欧美日韩人妻少妇 一区二区三区| 色九久| 操逼逼中文字幕| 天天综合网一91网| 性欧美精| 无码一区免费在线不卡| 国产精品熟女丝袜一区二区| 成人精品视频一区二区| 自拍啪啪视频| 蜜乳AV.COM| 亚洲精品视频二区| 啊啊啊啊啊啊啊网址在线观看| 97超碰色色| 免费中文在线| 久久精9| 蜜臀久久99精品久久久久久无删减 | 欧美少妇一区二区三区| 啊啊啊骚| 成人八戒网站| 欧美熟妇操操视频| 91亚洲高清| 亚欧高清v| 97精品综合久久网| 国产精品不卡高清在线观看| 99日韩| 新精精品久久精品| 2023天天操夜夜操| 久久麻豆一区二区| 97色欧洲| 日本高清一区二区在线| 五十路熟女工口| 精品人妻中文字幕高清| 性爱视频久久| 97久操| 伊人色综合网电影| 色悠久久久av| 少妇啪啪自拍| 大香伊人在线一区| 国产精品爆乳懂色蜜乳| 一本一道人妻久久一区二区三区 | 天综合网| 人妻少妇精品久久久久久久| 婷婷九月| 久久99九九九九6666免费观看软件| 岛国黄色大片网站| 激情小说亚洲视频| 91社操逼| 97精品97久久| aaaa少妇高潮大片| 日本性一区| 亚洲色图日韩精品| 男人的天堂日韩| 日逼国产| 男人的天堂三级| 色综合色欲色综合色综合色综合| 9ⅰ久久久天天| 伊人色综合网电影| 欧美亚洲在线| 免费观看欧美日韩操逼视频| 天天日夜干| 热天堂一区二区| 无遮挡男女激烈动态图| 欧美 传媒 麻豆 日韩 偷拍| 午夜视频久久久久一区| 91网站视频在线观看| 久久久亚洲高清不打码| 91n免费处女| 欧美黄色片AAAAA| 9丨久久九九九| 真实高潮91| 国产精品久久久久久久AV大片| 亚州 综合 色图| 亚洲一区二区三区欧美日韩| 91高清欧美| 手机av天堂久久久久| 日韩免费福利在线观看| #NAME?| www久| www国产无码| 9久精品视频在线观看| 亚洲最大网站av| 天天看片青娱乐| 另类av天堂| 中文自拍欧美影视| 久草免费在线视频| 国产传媒一区日韩| 破苞ⅩXXX性无码动漫无码| 大香蕉日韩| 国产丰满熟夫69mpp| 精品黑人一区二区| 碰碰97| 91无摭挡| 国产精品青青草| 国产精品一区二区三区,亚洲综合| 蜜区区视频79| 亚洲色图a| 偷窥自拍亚洲天堂网爆| av毛片aaaaa免费看| 精品综合久久久久久97| 国产欧美伊人| 中国一区二区亚洲人妻| 青草精品视频-日本久久久久网站| 美女AV一区二区| 一区二区激情国产熟女| 亚洲好看强奸乱伦| 九热久| 另类专区加勒比| 一区黄二区黄| 天堂种子在线www网资源| 亚洲啪啪视频免费| 91日韩网站| 天操老女人| 久久婷婷一区二| 日韩av在线播放不卡| 韩国免费播放一级毛片| 日产精品久久久一区二区| 久久水蜜臀亚洲AV无码精品| 五月天婷婷色色| 能在线播放的国产三级| 放黄片放3级黄片没穿衣服| 欧美97se| 九九九九免费高| 青娱乐亚洲热| 依人大香蕉| 久久鲁干| 日韩激情小说一区二区| 高清有码一区二区| 99国产女人| 97在线日韩中文字幕| 欧色性第一页| 成人综合网 欧美| 男人天堂婷婷五月天校园春色| 欧美性爱十八禁| 性爱边摸边日免费AV| 9色国产精品一区粉嫩| 91男人综合| 人妻献身系列第54部| 九九热超碰97亚洲最新香蕉| 12一15性XXXX粉嫩国产| 久久久一区二区| 熟女在线视频| 激情网五月天| 色小视频蜜乳| 无码高清专| 国模私拍一区二区三区神乳| 人妻精品一区二区| 国产诱惑| 在线情色电影 91大 | 国产精品99久久久www| 亚洲精品国产无码高清| 久久在线观看免费视频| 久久久久九九九| 色色色99| 97精品视频在线| 日韩精品操少妇| 5252色欧美在线| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 涩五月婷婷| 色色色99| 天天日天天插| 黄色AV影视| 亚洲色人妻综合| 亚洲国产综合久久天堂| 亚洲国产剧情少妇激情| 日本丝袜美腿人妻九九| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 亚洲色图欧美色图另类图片| 久操免费观看| 伊人天天久久动态图| 欧美巨大性舒爽顶到了| 国产极品粉嫩馒头一线天av| 无码区蜜乳| 国产三级日产三级韩国三级|