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

高端操作:把 React Scheduler 掏出來單獨用

開發(fā) 前端
Scheduler 是 React 提供的底層調(diào)度器。但是這個調(diào)度器具體是如何用的,可能大部分人都不太清楚了,好在 React 把內(nèi)部的模塊封裝得都相對獨立,因此,我們可以想個辦法,單獨把他的 Scheduler 或者 Reconciler 單獨掏出來用。

我們知道,Scheduler 是 React 提供的底層調(diào)度器。但是這個調(diào)度器具體是如何用的,可能大部分人都不太清楚了,好在 React 把內(nèi)部的模塊封裝得都相對獨立,因此,我們可以想個辦法,單獨把他的 Scheduler 或者 Reconciler 單獨掏出來用。

一、怎么掏

在 React 的 github 倉庫中,找到如下路徑的文件:./packages/scheduler/src。

這里就是 Scheduler 的全部代碼,如圖所示,我們可以在 forks 目錄中,找到 Scheduler.js,這就是我們的目標文件,他引用了外部的幾個小模塊的內(nèi)容。

// packages/scheduler/src/forks/Scheduler.js
import type {PriorityLevel} from '../SchedulerPriorities';

import {
  enableSchedulerDebugging,
  enableProfiling,
  enableIsInputPending,
  enableIsInputPendingContinuous,
  frameYieldMs,
  continuousYieldMs,
  maxYieldMs,
  userBlockingPriorityTimeout,
  lowPriorityTimeout,
  normalPriorityTimeout,
} from '../SchedulerFeatureFlags';

import {push, pop, peek} from '../SchedulerMinHeap';

// TODO: Use symbols?
import {
  ImmediatePriority,
  UserBlockingPriority,
  NormalPriority,
  LowPriority,
  IdlePriority,
} from '../SchedulerPriorities';
import {
  markTaskRun,
  markTaskYield,
  markTaskCompleted,
  markTaskCanceled,
  markTaskErrored,
  markSchedulerSuspended,
  markSchedulerUnsuspended,
  markTaskStart,
  stopLoggingProfilingEvents,
  startLoggingProfilingEvents,
} from '../SchedulerProfiling';

export type Callback = boolean => ?Callback;

這里需要注意的是,從 github 上掏出來的代碼不是用 TS 寫的,而是用 flow 寫的,因此這里部分語法可能會報錯,需要我們要自己稍作調(diào)整才能直接使用,不過改動不大。

SchedulerFeatureFlags.js 的代碼非常簡單,就是定義了一些狀態(tài)來區(qū)分不同的執(zhí)行階段。

/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow strict
 */

export const enableSchedulerDebugging = false;
export const enableIsInputPending = false;
export const enableProfiling = false;
export const enableIsInputPendingContinuous = false;
export const frameYieldMs = 5;
export const continuousYieldMs = 50;
export const maxYieldMs = 300;

export const userBlockingPriorityTimeout = 250;
export const normalPriorityTimeout = 5000;
export const lowPriorityTimeout = 10000;

SchedulerMinHeap.js 封裝了幾個小頂堆的操作方法,用于優(yōu)先級隊列的任務管理,因此常用的操作就是 pop、push、peek。

SchedulerPriorities.js 定義了幾個優(yōu)先級的常量。

/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow strict
 */

export type PriorityLevel = 0 | 1 | 2 | 3 | 4 | 5;

// TODO: Use symbols?
export const NoPriority = 0;
export const ImmediatePriority = 1;
export const UserBlockingPriority = 2;
export const NormalPriority = 3;
export const LowPriority = 4;
export const IdlePriority = 5;

SchedulerProfiling.js 是用來分析性能的,我們在調(diào)試的時候可以用一下。一般來說都會將其關(guān)掉。

直接把這些文件復制出來,整理好,就能單獨使用了。我們可以看一下 Scheduler.js 返回了什么方法。

export {
  ImmediatePriority as unstable_ImmediatePriority,
  UserBlockingPriority as unstable_UserBlockingPriority,
  NormalPriority as unstable_NormalPriority,
  IdlePriority as unstable_IdlePriority,
  LowPriority as unstable_LowPriority,
  unstable_runWithPriority,
  unstable_next,
  unstable_scheduleCallback,
  unstable_cancelCallback,
  unstable_wrapCallback,
  unstable_getCurrentPriorityLevel,
  shouldYieldToHost as unstable_shouldYield,
  requestPaint as unstable_requestPaint,
  unstable_continueExecution,
  unstable_pauseExecution,
  unstable_getFirstCallbackNode,
  getCurrentTime as unstable_now,
  forceFrameRate as unstable_forceFrameRate,
};

我們可以在源碼中去明確這些方法的具體使用方式,然后根據(jù)你的需要選擇使用即可。

二、語法介紹

我們可以使用 unstable_scheduleCallback 來調(diào)度任務,這個方法接收三個參數(shù)。

function unstable_scheduleCallback(
  priorityLevel: PriorityLevel,
  callback: Callback,
  options?: {delay: number},
)

priorityLevel 需要的參數(shù)我們在上面已經(jīng)定義好的,數(shù)字越小,優(yōu)先級越高。

callback 就是我們需要被調(diào)度的任務。

options 中,我們可以傳入 delay,來進一步降低任務執(zhí)行的優(yōu)先級,表示延遲任務。他會進入到 timerQueue 隊列而無法直接執(zhí)行,只有在特定時機移入到了 taskQueue 中之后才會被執(zhí)行。

unstable_scheduleCallback 返回一個 Task 對象,我們可以在源碼中看到這個對象大概長這樣。

var newTask: Task = {
  id: taskIdCounter++,
  callback,
  priorityLevel,
  startTime,
  expirationTime,
  sortIndex: -1,
};

unstable_cancelCallback 可以取消正在調(diào)度的任務,在源碼內(nèi)部內(nèi)容,它通過重置 task.callback = null 來取消。

OK,了解了基本用法之后,我們就可以來使用它調(diào)度任務了。

三、使用

想同優(yōu)先級

想想如下代碼輸出順序如何?

unstable_scheduleCallback(NormalPriority, () => {
  console.log(1)
})

unstable_scheduleCallback(NormalPriority, () => {
  console.log(2)
})

unstable_scheduleCallback(NormalPriority, () => {
  console.log(3)
})

unstable_scheduleCallback(NormalPriority, () => {
  console.log(4)
})

// 輸出順序:1, 2, 3, 4

由于他們優(yōu)先級相同,所以會按照任務創(chuàng)建的先后順序來確定誰的優(yōu)先級更高。因此,先創(chuàng)建的先執(zhí)行。

不同優(yōu)先級

現(xiàn)在我們調(diào)整一下優(yōu)先級,思考一下代碼輸出順序如何。

unstable_scheduleCallback(LowPriority, () => {
  console.log(1)
})

unstable_scheduleCallback(NormalPriority, () => {
  console.log(2)
})

unstable_scheduleCallback(ImmediatePriority, () => {
  console.log(3)
})

unstable_scheduleCallback(NormalPriority, () => {
  console.log(4)
})
// 輸出結(jié)果:3,2,4,1

此時優(yōu)先級不同,則優(yōu)先級越高的先執(zhí)行。

任務是否超時

我們在創(chuàng)建任務時,會給任務添加一個 expirationTime 字段來表示任務執(zhí)行時,是否超時。在回調(diào)函數(shù)中,可以接收一個參數(shù)來標記超時狀態(tài)。

unstable_scheduleCallback(NormalPriority, (isTimeout) => {
  console.log(4)
  console.log(isTimeout)
})

他的判斷標準如下:

const didUserCallbackTimeout = currentTask.expirationTime <= currentTime;

expirationTime 的計算規(guī)則如下:

var timeout;
switch (priorityLevel) {
  case ImmediatePriority:
    // Times out immediately
    timeout = -1;
    break;
  case UserBlockingPriority:
    // Eventually times out
    timeout = userBlockingPriorityTimeout;
    break;
  case IdlePriority:
    // Never times out
    timeout = maxSigned31BitInt;
    break;
  case LowPriority:
    // Eventually times out
    timeout = lowPriorityTimeout;
    break;
  case NormalPriority:
  default:
    // Eventually times out
    timeout = normalPriorityTimeout;
    break;
}

var expirationTime = startTime + timeout;

上面案例通常情況下會返回 false,但是我們可以在主線程中執(zhí)行一下耗時任務,讓其無法在超時時間以內(nèi)執(zhí)行。NormalPriority 優(yōu)先級的超時時間至少是 5000ms。

sunstable_scheduleCallback(NormalPriority, (isTimeout) => {
  console.log(4)
  console.log(isTimeout) // false
})

const currentTime = performance.now()
while(performance.now() - currentTime < 5000) {}
unstable_scheduleCallback(NormalPriority, (isTimeout) => {
  console.log(4)
  console.log(isTimeout) // true,執(zhí)行時已經(jīng)超時
})

const currentTime = performance.now()
while(performance.now() - currentTime < 5000) {}

再來看一個例子:

unstable_scheduleCallback(UserBlockingPriority, (isTimeout) => {
  console.log(2)
  console.log(isTimeout) // true
})

unstable_scheduleCallback(ImmediatePriority, (isTimeout) => {
  console.log(3)
  const currentTime = performance.now()
  while(performance.now() - currentTime < 100) {}
  console.log(isTimeout) // true
})

unstable_scheduleCallback(NormalPriority, (isTimeout) => {
  console.log(4)
  console.log(isTimeout) // false
})

const currentTime = performance.now()
while(performance.now() - currentTime < 200) {}

此時主線程卡住 200ms,因此 3 ImmediatePriority 超時。此時 3 執(zhí)行,又卡了 100ms,那么 2 UserBlockingPriority 對應 250ms 延遲時間,此時也超時了。

任務中斷

此時我們要聲明一個任務來遍歷一個數(shù)組,數(shù)組中的每一項的執(zhí)行時間都比較長,聲明數(shù)組如下:

const tasks: any[] = [
  ["1", 3],
  ["2", 3],
  ["3", 5],
  ["4", 7],
  ["5", 9],
];

我們可以結(jié)合 unstable_shouldYield 來判斷當前執(zhí)行時間是否過長,然后以中斷遍歷過程的方式,中斷任務的執(zhí)行。

function node_task() {
  console.log('開始執(zhí)行任務')
  var task
  while(task = tasks.shift()) {
    var now = performance.now()
    // 卡住執(zhí)行
    while(performance.now() - now < task[1]) {}
    console.log(task[0], '小任務執(zhí)行完畢')
    if (unstable_shouldYield()) {
      console.log('執(zhí)行超過了 5ms,中斷執(zhí)行')
      return node_task
    }
  }
}

unstable_shouldYield 是超過 5ms 就需要中斷一次,此時我們發(fā)現(xiàn),任務 1 與 任務 2 加起來超過了 5ms,因此 2 執(zhí)行完之后,會中斷一次。,后面的每個任務都比較長,因此每個任務執(zhí)行完都會中斷一次,所以總共會中斷 4 次。

調(diào)度之后,我們看看打印結(jié)果:

unstable_scheduleCallback(NormalPriority, node_task);

完整的符合預期。

高優(yōu)先級插隊

我們只需要把上面的案例稍作調(diào)整,就能做到高優(yōu)先級插隊。在 node_task 的執(zhí)行過程中,我們利用 setTimeout 調(diào)度一個更高優(yōu)先級的任務。

const tasks: any[] = [
  ["1", 3],
  ["2", 3],
  ["3", 5],
  ["4", 7],
  ["5", 9],
];

function node_task() {
  console.log('--開始執(zhí)行任務--')
  var task
  while(task = tasks.shift()) {
    var now = performance.now()
    // 卡住執(zhí)行
    while(performance.now() - now < task[1]) {}
    console.log(task[0], '小任務執(zhí)行完畢')
    if (unstable_shouldYield()) {
      console.log('執(zhí)行超過了 5ms,中斷執(zhí)行')
      return node_task
    }
  }
}

unstable_scheduleCallback(NormalPriority, node_task);
+ setTimeout(() => {
+   unstable_scheduleCallback(ImmediatePriority, () => {
+     console.log('我是高優(yōu)先級插隊')
+  });
+ }, 10)

執(zhí)行結(jié)果如下,插隊成功。

四、總結(jié)

我們可以利用這一套優(yōu)先級隊列的調(diào)度,解決實踐中的需求。例如,在開發(fā)彈幕功能的時候,我們會想辦法優(yōu)先讓自己發(fā)的彈幕先彈出來。或者在消息彈窗提示時,優(yōu)先彈出錯誤警告等。

責任編輯:姜華 來源: 這波能反殺
相關(guān)推薦

2025-07-17 08:18:07

2022-12-06 08:30:06

SchedulerReact

2021-11-30 06:56:59

MySQL幻讀查詢

2022-02-15 08:49:29

繼承C++variant

2020-05-26 08:32:56

Python代碼開發(fā)

2018-04-04 14:44:08

2009-12-09 13:46:25

2013-11-05 10:01:45

2015-10-29 09:36:31

高端編程語言

2021-04-09 18:01:03

前端ReactDOM

2021-04-12 06:04:30

React操作系統(tǒng)Reconciler

2021-08-09 17:13:39

數(shù)值運算

2024-08-07 10:19:00

2015-10-19 09:17:08

2023-11-29 09:29:48

Kuberneteskube

2023-03-03 15:37:32

GMP 模型goroutine

2021-01-29 08:22:03

調(diào)度器Yarn架構(gòu)

2021-01-05 09:07:30

Django ORMF查詢Q查詢

2014-10-14 16:17:52

DCS存儲操作系統(tǒng)
點贊
收藏

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

国产欧美一区二区在线观看| 先锋资源久久| 欧美视频精品一区| 免费成人深夜夜行视频| 日韩在线观看第一页| 亚洲va久久久噜噜噜久久| 日本道精品一区二区三区| av成人午夜| 久久精品久久国产| 亚洲图片久久| 日本乱人伦一区| 亚洲欧美国产一区二区| 国产精品久久欧美久久一区| 国内精品福利| 亚洲天堂男人天堂| 91热视频在线观看| 黄毛片在线观看| 欧美韩国日本一区| 亚洲a成v人在线观看| 欧美一级特黄高清视频| 国产精品麻豆成人av电影艾秋| 亚洲欧洲日本在线| 国产三级精品在线不卡| 羞羞色院91蜜桃| 欧美黄污视频| 亚洲欧洲日产国码av系列天堂| 999这里有精品| av免费不卡| 国产精品久久久久久户外露出| 成人黄动漫网站免费| 无码人妻精品一区二区| 你懂的视频一区二区| 亚洲欧美第一页| 性色av浪潮av| 四虎4545www精品视频| 夜夜爽夜夜爽精品视频| 日韩和欧美的一区二区| 亚洲AV无码成人片在线观看| 日韩精品一级中文字幕精品视频免费观看| 精品国偷自产在线视频| 黄色国产在线观看| 欧美aaa视频| 亚洲二区视频在线| 国产奶头好大揉着好爽视频| 天堂在线中文| 国产91精品欧美| 国产美女直播视频一区| 日韩成人免费观看| 亚洲人体av| 亚洲香蕉成视频在线观看| 亚洲av无码一区东京热久久| 97色婷婷成人综合在线观看| 一本大道久久精品懂色aⅴ| 中文字幕の友人北条麻妃| 国产黄色片在线播放| 粉嫩aⅴ一区二区三区四区| 国产精品无码专区在线观看| 一级片中文字幕| 亚洲国产一区二区精品专区| 欧美成人性生活| 日本爱爱小视频| 欧美手机视频| 亚洲色图国产精品| 偷拍夫妻性生活| 香蕉久久99| 亚洲国语精品自产拍在线观看| 在线观看免费看片| 国产一区二区三区| 欧美一区二区性放荡片| 亚洲一区二区三区观看| 在线高清欧美| 777奇米成人网| 九九久久久久久| 国产精品色婷婷在线观看| 欧美日韩三级在线| 一本色道久久亚洲综合精品蜜桃| 国产精品迅雷| 色婷婷香蕉在线一区二区| 成年人观看网站| 欧美男体视频| 欧美性色综合网| 天天色综合社区| 日本欧美韩国| 欧美日韩精品综合在线| 中文字幕亚洲影院| 国产精品亚洲综合在线观看| 在线成人免费视频| 五月天国产视频| 日韩欧美中文在线观看| 精品久久久三级丝袜| 亚洲无人区码一码二码三码| 另类ts人妖一区二区三区| 日韩精品中文字幕在线| 欧美三级视频网站| 五月婷婷亚洲| 久久韩剧网电视剧| 麻豆亚洲av成人无码久久精品| 欧美二区视频| 91精品国产亚洲| 欧美日韩a v| 久久se这里有精品| 97影院在线午夜| 污视频网站在线播放| 久久精品夜色噜噜亚洲aⅴ| 性高潮久久久久久久久| 精品孕妇一区二区三区| 亚洲国产乱码最新视频 | av女在线播放| 欧洲另类一二三四区| 午夜一区二区视频| 激情小说亚洲图片| 在线精品国产欧美| 久久久夜色精品| 久久午夜激情| 亚洲精品欧美日韩| 三级视频在线播放| 亚洲视频一区在线| 女人喷潮完整视频| 麻豆精品蜜桃| 欧美一二三区精品| 色噜噜在线观看| 日韩精品网站| 久久久久久久久久久久av| 丰满少妇xoxoxo视频| 精品一区二区在线免费观看| 极品日韩久久| 99re在线视频| 一区二区三区在线免费视频| 日本久久久精品视频| 国产一区二区三区免费在线| 亚洲免费av网址| 99精品久久久久| 日韩1区2区3区| 国产精品污www一区二区三区| 亚洲s色大片| 日韩欧美999| 岛国大片在线免费观看| 日韩欧美一区二区三区免费看| 久久久久久亚洲精品中文字幕| 精品国产www| 97精品国产露脸对白| 日韩一级特黄毛片| 亚洲图片小说区| 国产香蕉一区二区三区在线视频 | 一二三区精品视频| 九九九九九国产| 精品国产乱码久久久| 韩国福利视频一区| 国产成a人亚洲精v品无码| 国产精品剧情在线亚洲| 日韩精品一区二区三区不卡 | 欧美人与性囗牲恔配| 日韩一区二区免费看| 99久久99久久精品国产片| 免费在线观看av网站| 91福利在线导航| 蜜桃传媒一区二区亚洲av| 欧美视频久久| av免费精品一区二区三区| 黄网站视频在线观看| 欧美日韩国产天堂| 欧美人与性囗牲恔配| 日韩高清在线不卡| 欧美一区少妇| 欧美成人影院| 亚洲人免费视频| 中文在线第一页| 白白色 亚洲乱淫| 野外做受又硬又粗又大视频√| 日韩在线亚洲| 日韩中文字幕在线看| 亚洲成熟少妇视频在线观看| 久久亚洲影视婷婷| 欧美成人xxxxx| 伊人春色之综合网| 欧美与欧洲交xxxx免费观看| 亚洲av电影一区| 欧美日韩国产丝袜另类| 亚洲精品在线视频免费观看| 一二三区精品| 久久久久一区二区| 成人小电影网站| 国产一区二区三区在线| 在线观看免费视频一区| 综合欧美亚洲日本| 2025中文字幕| 亚洲黄网站黄| 日韩精品一区二区三区四区五区 | 欧美一级免费片| 婷婷国产v国产偷v亚洲高清| 右手影院亚洲欧美| 日本欧美一区二区在线观看| 日本福利视频导航| 日韩精品免费视频一区二区三区| 久久久久久久久久久亚洲| www.狠狠干| 精品久久久精品| 中文字幕av久久爽一区| 国产一区免费电影| 黄色成人在线看| 成人影院天天5g天天爽无毒影院 | 在线观看你懂的网站| 成人免费视频在线观看| 国偷自产av一区二区三区麻豆| 亚洲日韩成人| 亚洲欧美国产精品桃花| 精品淫伦v久久水蜜桃| 国产成人亚洲综合青青| 成人在线观看免费网站| 亚洲国产精品成人av| 国产天堂第一区| 中文字幕一区二区三区乱码在线| 男人女人拔萝卜视频| 亚洲尤物精选| 色乱码一区二区三区熟女| 好吊妞视频这里有精品| 国产成人啪精品视频免费网| 99在线播放| 亚洲天堂色网站| 国产人妖一区二区| 色屁屁一区二区| 久久久.www| 国产无人区一区二区三区| 三大队在线观看| 日韩高清一区二区| 成人网站免费观看入口| 色综合五月天| 国产精品久久久久久久久久久久午夜片| 成人爽a毛片免费啪啪| 毛片精品免费在线观看| 国产一区电影| 亚洲国产古装精品网站| 国产高清免费av| 欧美视频在线不卡| av资源免费观看| 亚洲自拍偷拍欧美| 亚洲激情图片网| 久久久久久影视| 伦理片一区二区| 国产乱理伦片在线观看夜一区| 亚洲爆乳无码专区| 亚洲精品韩国| 久久久久久久久久久久久国产| 第一社区sis001原创亚洲| 蜜桃91精品入口| 欧美理伦片在线播放| 亚洲一区二区三| 亚洲精品aa| 国产精品欧美一区二区三区奶水| 国产美女高潮在线观看| 欧美丰满少妇xxxxx做受| 欧美性天天影视| 一区二区三区四区精品| 精品美女视频在线观看免费软件| 亚洲成人精品在线| www三级免费| 91精品国产综合久久久蜜臀粉嫩| 中文字幕二区三区| 欧美亚洲国产一区二区三区| 日韩电影在线观看一区二区| 黑人精品xxx一区| 五月婷婷开心网| 欧美日韩免费区域视频在线观看| 国产无遮挡又黄又爽在线观看| 亚洲夂夂婷婷色拍ww47 | 亚洲午夜视频在线| 欧美成人精品欧美一级| 一区二区三区在线观看动漫| 欧美成人黄色网| 亚洲成人tv网| 日本三级2019| 欧美日韩一区二区在线| 亚洲第一在线播放| 日本久久一区二区三区| 国产真人无遮挡作爱免费视频| 一本到三区不卡视频| 在线免费观看国产精品| 欧美天堂亚洲电影院在线播放| 中文字幕精品无| 欧美乱妇15p| 国产黄色美女视频| 精品国产乱码久久久久久浪潮| 亚洲av无码片一区二区三区| 精品欧美一区二区三区精品久久| www男人的天堂| 日韩激情视频在线| 国产中文字幕在线视频| 国产亚洲视频在线| 久草资源在线| 久久久久久999| 中文在线免费二区三区| 国产精品久久久久久久久| 日韩一区二区三区四区五区 | 国产精品视频一区二区三区,| 欧美sm美女调教| 人成在线免费视频| 色悠悠国产精品| 日韩欧美一起| 日本午夜人人精品| 99久久99九九99九九九| 国产传媒欧美日韩| 国产精品欧美三级在线观看| 一区二区三区不卡在线| 国内久久视频| 欧美精品99久久| 精品一区二区三区不卡| 99精品一区二区三区无码吞精| 久久视频一区二区| 神马午夜精品91| 精品欧美一区二区三区| 亚洲在线免费观看视频| 欧美精品一区二区三区视频| 国产精品无码2021在线观看| 欧美精品生活片| 国产极品一区| 国产偷国产偷亚洲高清97cao| 成人毛片在线| 亚洲人成无码网站久久99热国产| 日本在线观看不卡视频| 日批免费观看视频| 中文字幕av资源一区| 日韩毛片在线播放| 欧美日韩精品一区二区| 亚洲三区在线播放| 久久天天躁夜夜躁狠狠躁2022| 成人bbav| 91日韩在线视频| 精品久久不卡| 国产91xxx| 国产乱妇无码大片在线观看| 国产视频三区四区| 精品久久久久久久大神国产| 国产三级按摩推拿按摩| 国产亚洲欧美日韩美女| а√在线中文网新版地址在线| 91九色视频在线| 不卡在线一区| 无码无遮挡又大又爽又黄的视频| 国产成人日日夜夜| 自拍偷拍第9页| 91高清在线观看| 三级毛片在线免费看| 久久久久久久久久久久av| 国产在线视频欧美一区| 亚洲欧洲精品一区二区三区波多野1战4| 99国产精品久久久久久久| 国产裸体视频网站| 最好看的中文字幕久久| 中文字幕+乱码+中文| 亚洲欧美www| 高清不卡av| 日本视频一区二区在线观看| 国产麻豆综合| av无码一区二区三区| 亚洲国产欧美一区二区三区丁香婷| 国产口爆吞精一区二区| 日韩视频在线免费观看| 国产情侣一区二区三区| 日韩视频在线播放| 日本伊人午夜精品| av网在线播放| 欧美三级三级三级| 尤物网在线观看| 91九色国产视频| 欧美日韩综合| 9.1在线观看免费| 一区二区三区精品视频在线| 中文字幕一区二区人妻痴汉电车 | 人妻中文字幕一区| 97久久精品人搡人人玩| 日韩在线视频一区二区三区| 中文字幕の友人北条麻妃| 国产精品一区二区在线观看不卡| 刘亦菲国产毛片bd| 欧美伊人精品成人久久综合97 | av在线一区二区| 久久久久久久久久免费视频| 日韩精品久久久久| 忘忧草在线日韩www影院| 久久精品国产精品青草色艺| 久久久蜜桃一区二区人| 色欲AV无码精品一区二区久久| 欧美吞精做爰啪啪高潮| 成人无遮挡免费网站视频在线观看| 亚洲已满18点击进入在线看片 | 亚洲天堂第一区| av日韩在线网站| 成年人视频免费| 久久国产精品免费视频| 9l视频自拍蝌蚪9l视频成人| 国产中文字幕二区| 久久久久久久性| 91国在线视频| 精品国产一区二区三区久久久狼| 91成人福利| 午夜视频你懂的| 亚洲精品一二三| 日本一二三区在线视频| 国产一区二区香蕉| 欧美视频导航|