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

八個關于 Promise 高級用途的技巧

開發 前端
在js項目中,promise的使用應該是必不可少的,但我發現在同事和面試官中,很多中級以上的前端仍然堅持promiseInst.then()、promiseInst.catch()、Promise等常規用法等等。即使是 async/await 他們也只知道它但不知道為什么要使用它。

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心~

我發現很多人只知道如何常規地使用promise。

在js項目中,promise的使用應該是必不可少的,但我發現在同事和面試官中,很多中級以上的前端仍然堅持promiseInst.then()、promiseInst.catch()、Promise等常規用法等等。即使是 async/await 他們也只知道它但不知道為什么要使用它。

但實際上,Promise 有很多巧妙的高級用法,并且一些高級用法在 alova 請求策略庫內部也被廣泛使用。

現在,我將與大家分享8個高級使用技巧。希望這些技巧能夠對你有所幫助,現在,我們就開始吧。

1. Promise數組的串行執行

例如,如果你有一組接口需要串行執行,你可能首先想到使用await。

const requestAry = [() => api.request1(), () => api.request2(), () => api.request3()];
for (const requestItem of requestAry) {
  await requestItem();
}

如果使用promise,可以使用then函數串聯多個promise,實現串行執行。

const requestAry = [() => api.request1(), () => api.request2(), () => api.request3()];
const finallyPromise = requestAry.reduce(
     (currentPromise, nextRequest) => currentPromise.then(() => nextRequest()),
     Promise.resolve() // Create an initial promise for linking promises in the array
);

2. 在新的 Promise 范圍之外更改狀態

假設你有多個頁面,其功能要求在允許使用之前收集用戶信息。點擊使用某個功能之前,會彈出一個彈框進行信息收集。你會如何實施這個?

以下是不同級別前端同學的實現思路:

初級前端:我寫一個模態框,然后復制粘貼到其他頁面。效率非常高!

中級前端:這個不好維護。我們需要單獨封裝這個組件,并在需要的頁面引入!

高級前端:安裝任何密封的東西!!!把方法調用寫在所有頁面都可以調用的地方不是更好嗎?

想要了解高級前端是如何實現的,以vue3為例,看一下下面的例子。

<!-- App.vue -->
<template>
<!-- The following is the modal box component -->
   <div class="modal" v-show="visible">
     <div>
       User name: <input v-model="info.name" />
     </div>
     <!-- Other information -->
     <button @click="handleCancel">Cancel</button>
     <button @click="handleConfirm">Submit</button>
   </div>
   <!-- Page components -->
</template>
<script setup>
import { provide } from 'vue';
const visible = ref(false);
const info = reactive({
   name: ''
});
let resolveFn, rejectFn;
// Pass the information collection function to the following
provide('getInfoByModal', () => {
   visible.value = true;
   return new Promise((resolve, reject) => {
     // Assign the two functions to the outside and break through the promise scope
     resolveFn = resolve;
     rejectFn = reject;
   });
})
const handleConfirm = () => {
   resolveFn && resolveFn(info);
};
const handleCancel = () => {
   rejectFn && rejectFn(new Error('User has canceled'));
};
</script>

接下來,getInfoByModal就可以通過直接調用模態框來輕松獲取用戶填寫的數據。

<template>
   <button @click="handleClick">Fill in the information</button>
</template>


<script setup>
import { inject } from 'vue';
const getInfoByModal = inject('getInfoByModal');
const handleClick = async () => {
   // After the call, the modal box will be displayed. After the user clicks to confirm, the promise will be changed to the fullfilled state to obtain the user information.
   const info = await getInfoByModal();
   await api.submitInfo(info);
}
</script>

這也是很多UI組件庫中封裝常用組件的一種方式。

3. async/await 的替代用法

很多人只知道它是用來在調用await時接收async函數的返回值的,卻不知道async函數它實際上是一個返回promise的函數。例如,以下兩個函數是等效的:

const fn1 = async () => 1;
const fn2 = () => Promise.resolve(1);


fn1(); // Also returns a promise object with a value of 1

在大多數情況下,await 會跟隨 Promise 對象并等待它完全填充。因此,下面的 fn1 函數 wait 也是等價的:

await fn1();


const promiseInst = fn1();
await promiseInst;

然而,await也有一個鮮為人知的秘密。當它后面跟的值不是promise對象時,它會用promise對象包裝該值,所以await后面的代碼必須異步執行。例子:

Promise.resolve().then(() => {
  console.log(1);
});
await 2;
console.log(2);
//Print order bits: 1 2

相當于

Promise.resolve().then(() => {
  console.log(1);
});
Promise.resolve().then(() => {
  console.log(2);
});

4. 承諾實施請求共享

當一個請求已經發出但尚未得到響應時,再次發出相同的請求,就會造成請求的浪費。此時,我們可以將第一個請求的響應與第二個請求共享。

request('GET', '/test-api').then(response1 => {
  // ...
});
request('GET', '/test-api').then(response2 => {
  // ...
});

上述兩個請求實際上只發送一次,同時收到相同的響應值。

那么,請求共享有哪些使用場景呢?我認為有以下三個:

  • 當頁面渲染多個內部組件同時獲取數據時;
  • 提交按鈕未禁用且用戶連續多次點擊提交按鈕;
  • 預加載數據的情況下,預加載完成之前進入預加載頁面;

這也是alova的高級功能之一。要實現請求共享,需要使用promise的緩存功能,即一個promise對象可以通過多次await獲取數據。簡單的實現思路如下:

const pendingPromises = {};
function request(type, url, data) {
   // Use the request information as the only request key to cache the promise object being requested
   //Requests with the same key will reuse promise
   const requestKey = JSON.stringify([type, url, data]);
   if (pendingPromises[requestKey]) {
     return pendingPromises[requestKey];
   }
   const fetchPromise = fetch(url, {
     method: type,
     data: JSON.stringify(data)
   })
   .then(response => response.json())
   .finally(() => {
     delete pendingPromises[requestKey];
   });
   return pendingPromises[requestKey] = fetchPromise;
}

上述兩個請求實際上只發送一次,同時收到相同的響應值。

那么,請求共享有哪些使用場景呢?我認為有以下三個:

  • 當頁面渲染多個內部組件同時獲取數據時;
  • 提交按鈕未禁用且用戶連續多次點擊提交按鈕;
  • 預加載數據的情況下,預加載完成之前進入預加載頁面;

這也是alova的高級功能之一。要實現請求共享,需要使用promise的緩存功能,即一個promise對象可以通過多次await獲取數據。簡單的實現思路如下:

const promise = new Promise((resolve, reject) => {
  resolve();
  reject();
});

正確答案是已滿狀態。我們只需要記住,一旦待處理的promise從一種狀態轉移到另一種狀態,就無法更改。因此,例子中是先轉為fulfilled狀態,然后reject()就不會再轉為rejected狀態。

6.徹底明確then/catch/finally返回值

一句話概括就是,上面三個函數都會返回一個新的promise包裝對象。包裝后的值是執行回調函數的返回值。如果回調函數拋出錯誤,它將包裝拒絕狀態承諾。似乎不太容易理解,我們來看一個例子:

我們可以將它們一一復制到瀏覽器控制臺并運行它們以幫助理解。

// then function
Promise.resolve().then(() => 1); // The return value is new Promise(resolve => resolve(1))
Promise.resolve().then(() => Promise.resolve(2)); // Return new Promise(resolve => resolve(Promise.resolve(2)))
Promise.resolve().then(() => {
   throw new Error('abc')
}); // Return new Promise(resolve => resolve(Promise.reject(new Error('abc'))))
Promise.reject().then(() => 1, () => 2); // The return value is new Promise(resolve => resolve(2))


//catch function
Promise.reject().catch(() => 3); // The return value is new Promise(resolve => resolve(3))
Promise.resolve().catch(() => 4); // The return value is new Promise(resolve => resolve(promise object that calls catch))
//When the finally function returns a non-promise value, return the promise object before the finally function.
Promise.resolve().finally(() => {}); // Return Promise.resolve()
Promise.reject().finally(() => {}); // Return Promise.reject()
// When the return value of the finally function is promise, wait for the returned promise to be parsed before returning the promise object before the finally function.
Promise.resolve(5).finally(() => new Promise(res => {
   setTimeout(res, 1000);
})); // Return the Promise in pending status, which will be resolved to 5 after 1 second.
Promise.reject(6).finally(() => new Promise(res => {
   setTimeout(res, 1000);
})); // Return the Promise in the pending state, and throw the number 6 after 1 second

7、then函數的第二次回調和catch回調有什么區別?

當請求發生錯誤時,會觸發 Promise 的 then 的第二個回調函數和 catch。乍一看沒有區別,但實際上前者無法捕獲then當前第一個回調函數中拋出的錯誤,但catch可以。

Promise.resolve().then(
   () => {
     throw new Error('Error from success callback');
   },
   () => {
     // will not be executed
   }
).catch(reason => {
   console.log(reason.message); // Will print out "error from success callback"
});

原理就如上一點所說的。catch 函數是在 then 函數返回的處于拒絕狀態的 Promise 上調用的,因此它的錯誤自然可以被捕獲。

8.(最終)Promise實現koa2洋蔥中間件模型

koa2框架引入了洋蔥模型,可以讓你的請求像剝洋蔥一樣一層層進去,再一層層出來,從而實現請求前后處理的統一。

圖片

我們來看一個簡單的 koa2 洋蔥模型:

const app = new Koa();
app.use(async (ctx, next) => {
  console.log('a-start');
  await next();
  console.log('a-end');
});
app.use(async (ctx, next) => {
  console.log('b-start');
  await next();
  console.log('b-end');
});


app.listen(3000);

上面的輸出是a-start -> b-start -> b-end -> a-end,這樣神奇的輸出序列是如何實現的呢?有人沒天賦,簡單的用20行左右的代碼就實現了。如有雷同,純屬巧合。

接下來我們分析一下

注:以下內容對新手不友好,請謹慎閱讀。

首先先保存中間件函數,在listen函數中收到請求后調用洋蔥模型執行。

function action(koaInstance, ctx) {
  // ...
}


class Koa {
   middlewares = [];
   use(mid) {
     this.middlewares.push(mid);
   }
   listen(port) {
     // Pseudocode simulates receiving request
     http.on('request', ctx => {
       action(this, ctx);
     });
   }
}

收到請求后,從第一個中間件開始串行執行next之前的前置邏輯。

//Start to start middleware call
function action(koaInstance, ctx) {
   let nextMiddlewareIndex = 1; // Identifies the next middleware index to be executed


   //Define next function
   function next() {
     // Before peeling the onion, calling next will call the next middleware function
     const nextMiddleware = middlewares[nextMiddlewareIndex];
     if (nextMiddleware) {
       nextMiddlewareIndex++;
       nextMiddleware(ctx, next);
     }
   }
   //Start execution from the first middleware function and pass in the ctx and next functions
   middlewares[0](ctx, next);
}

處理next之后的post邏輯

function action(koaInstance, ctx) {
   let nextMiddlewareIndex = 1;
   function next() {
     const nextMiddleware = middlewares[nextMiddlewareIndex];
     if (nextMiddleware) {
       nextMiddlewareIndex++;
       // A return is also added here to allow the execution of the middleware function to be executed in series from back to front using promises (it is recommended to understand this return repeatedly)
       return Promise.resolve(nextMiddleware(ctx, next));
     } else {
       // When the pre-logic of the last middleware is executed, return the fullyfilled promise and start executing the post-logic after next.
       return Promise.resolve();
     }
   }
   middlewares[0](ctx, next);
}

至此,一個簡單的洋蔥模型就已經實現了。

責任編輯:武曉燕 來源: 前端之神
相關推薦

2025-02-07 15:01:49

Promise數組前端

2024-01-02 16:16:34

Promise前端

2024-07-02 09:03:48

2025-02-10 10:38:24

2012-10-29 11:01:17

2022-12-15 16:38:17

2025-01-02 15:08:36

SpringBoot自動配置Java

2022-05-30 00:04:16

開源Github技巧

2010-08-25 11:14:05

云安全數據安全網絡安全

2023-10-24 09:25:23

IT技巧文化

2024-03-21 09:58:27

ExtractTypeScript工具類型

2021-01-11 08:30:02

Dubbo服務

2024-04-01 07:51:49

Exclude?工具類型TypeScript

2023-06-27 09:21:33

2023-01-03 11:47:47

2025-05-09 09:26:12

2023-02-22 14:50:59

技術AI

2010-09-09 13:44:06

DIVCSS

2011-09-25 10:46:18

云計算安全

2010-08-11 16:43:05

職場
點贊
收藏

51CTO技術棧公眾號

欧美日韩精品在线视频| 成人福利视频在线| 精品国产欧美一区二区三区成人 | 精品国产乱子伦一区| 国产成人黄色片| 亚洲成人三级| 成人少妇影院yyyy| 国产精品视频一| 国产成人啪精品午夜在线观看| 国产一区99| 欧美不卡一区二区三区四区| 亚洲精品中文字幕无码蜜桃| 91中文在线| 国产天堂亚洲国产碰碰| 91中文字精品一区二区| 一级黄色av片| 在线精品亚洲| 最新中文字幕亚洲| 北岛玲一区二区| www.欧美视频| 欧美综合天天夜夜久久| 国产精品久久..4399| 日本福利在线| 久久蜜臀精品av| 波多野结衣精品久久| 高潮无码精品色欲av午夜福利| 极品裸体白嫩激情啪啪国产精品| 最近中文字幕mv在线一区二区三区四区 | 国产亚洲精品日韩| 国产一级免费片| 色婷婷成人网| 欧洲生活片亚洲生活在线观看| av网站大全免费| 中文字幕在线播放网址| 中文字幕五月欧美| 日韩中文字幕一区| 色视频在线看| www.欧美色图| 国产在线精品一区二区三区》| 国产欧美熟妇另类久久久 | 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产福利片在线| 久久久久久亚洲综合影院红桃 | 精品国产乱码久久久久久果冻传媒| 精品免费99久久| 亚洲AV成人精品| 日韩视频一二区| 91精品视频网| 天天操精品视频| 成人久久精品| 欧美一区二区视频网站| 亚洲一区精品视频在线观看| 欧洲成人一区| 欧美久久一二区| 污污动漫在线观看| 日日夜夜一区| 欧美一区二区三区在线观看视频| 亚洲第一色av| 一本一道久久a久久| 日韩欧美一级特黄在线播放| 亚洲少妇中文字幕| 精品中国亚洲| 精品一区二区三区三区| 黄色aaa视频| 国产一区二区三区四区大秀| 国产亚洲视频在线观看| 国产又粗又长又硬| 五月开心六月丁香综合色啪| 欧美成人sm免费视频| 久草视频免费播放| 99视频一区| 国产精品爱啪在线线免费观看| 亚洲精品一区二区二区| 激情综合色播激情啊| 147欧美人体大胆444| 亚洲av无码一区二区三区dv| 成人免费视频caoporn| 久久av一区二区三区漫画| 黄色av网站在线| 最新欧美精品一区二区三区| 中国丰满熟妇xxxx性| 惠美惠精品网| 欧美日韩的一区二区| 波多野结衣三级视频| 亚洲视频分类| 久久精品国产清自在天天线| 久久在线视频精品| 久久久噜噜噜| 亚洲综合中文字幕68页| 无码国精品一区二区免费蜜桃| 久久久精品免费免费| 国产精品88久久久久久妇女| 日韩精品av| 欧美疯狂性受xxxxx喷水图片| 岛国av免费观看| 国产精品免费99久久久| 欧美丰满少妇xxxxx| 91porny九色| 国产成人午夜精品5599| 日韩在线三级| 97人人爽人人澡人人精品| 欧美视频日韩视频在线观看| 最新中文字幕日本| 成人在线免费观看91| 高清亚洲成在人网站天堂| 天天操天天干天天摸| 国产不卡视频一区二区三区| 日韩在线国产| 香蕉伊大人中文在线观看| 4hu四虎永久在线影院成人| 亚洲熟妇无码av| 国产精品国码视频| 成人黄色av播放免费| 香蕉久久一区二区三区| 亚洲精品菠萝久久久久久久| 久久久久久香蕉| 国产亚洲成av人片在线观黄桃| 色系列之999| 高潮毛片又色又爽免费| 丁香六月久久综合狠狠色| 一区二区三区四区视频在线| 性欧美freesex顶级少妇| 日韩欧美激情四射| 强制高潮抽搐sm调教高h| 久久精品卡一| 精品91免费| 欧美人与牲禽动交com | 色播五月激情五月| 亚欧洲精品视频在线观看| 欧美激情喷水视频| a天堂在线视频| 国产精品电影一区二区三区| 精品视频无码一区二区三区| 亚欧洲精品视频在线观看| 97国产suv精品一区二区62| 国产哺乳奶水91在线播放| 国产精品乱人伦中文| 在线观看免费成人av| 少妇高潮一区二区三区| 136fldh精品导航福利| 人妻少妇精品无码专区| 亚洲欧美激情插| 99精品999| 国产韩国精品一区二区三区| 91精品久久久久久久| 亚乱亚乱亚洲乱妇| 欧美三级蜜桃2在线观看| 黄色av免费播放| 日韩—二三区免费观看av| 日本一区二区不卡高清更新| 怡红院成人在线| 伊人久久久久久久久久| 中文字幕在线网站| 国产精品国产三级国产aⅴ入口| 五月婷婷六月丁香激情| 99精品视频在线| 91亚洲国产成人久久精品网站| 免费黄网站在线| 欧美一区二区三区视频在线观看| 黄色a级片在线观看| 九九**精品视频免费播放| 亚洲成年人专区| 日韩在线视频一区二区三区| 欧美激情手机在线视频 | 你真棒插曲来救救我在线观看| 国产精品任我爽爆在线播放| 欧美在线影院在线视频| avtt在线播放| 日韩午夜在线播放| 99热国产在线观看| 国产亚洲欧美日韩俺去了| mm131国产精品| 亚洲视屏一区| 蜜桃导航-精品导航| 欧美日韩女优| 欧美高跟鞋交xxxxhd| 欧美日韩影视| 在线电影国产精品| 久久精品免费在线| 久久先锋影音av鲁色资源网| 国产乱女淫av麻豆国产| 亚洲视频中文| 午夜精品一区二区在线观看 | 一区二区三区观看| 成人精品毛片| 国产精品欧美日韩久久| 性直播体位视频在线观看| 亚洲精品福利资源站| 亚洲国产无线乱码在线观看| 亚洲一区二区三区四区的| 国产特级黄色录像| 国产精品 日产精品 欧美精品| 欧美极品欧美精品欧美| 91中文字幕精品永久在线| 狠狠色综合色区| 欧美视频精品| 2019av中文字幕| 麻豆系列在线观看| 日韩毛片在线看| 国产高清免费观看| 在线影院国内精品| 久草视频精品在线| 国产精品国产三级国产有无不卡| 波多野结衣加勒比| 国产制服丝袜一区| 国产真实乱子伦| 欧美日韩三区| 最新中文字幕久久| 精品理论电影| 精品综合在线| 亚洲综合影院| 成人信息集中地欧美| 成人线上视频| 久久久久久久999精品视频| 日本美女高清在线观看免费| 亚洲深夜福利网站| 性xxxx视频| 亚洲福利影片在线| 精品人妻一区二区三区日产乱码| 精品视频1区2区| 男人的天堂av网站| 午夜电影网亚洲视频| 久久r这里只有精品| 国产精品美女久久久久久久网站| 中国美女乱淫免费看视频| 成人一级黄色片| 日韩欧美中文视频| 极品美女销魂一区二区三区| 色综合天天色综合| 首页欧美精品中文字幕| 欧美极品欧美精品欧美| 91久久综合| 免费特级黄色片| 在线欧美日韩| 青草视频在线观看视频| 国产精品黄色| 日本阿v视频在线观看| 黄色免费成人| 东北少妇不带套对白| 国色天香一区二区| 久久手机在线视频| 亚洲午夜极品| 久操网在线观看| 精品成人免费| 日韩av片在线看| 视频一区二区不卡| 一级黄色香蕉视频| 免费在线观看视频一区| 男操女免费网站| 激情伊人五月天久久综合| 视频区 图片区 小说区| 国产精品亚洲午夜一区二区三区| 亚洲五月激情网| 成人免费视频app| 国产网站无遮挡| 久久久99精品免费观看不卡| xxxx日本黄色| 国产精品美女久久久久久久| 大地资源高清在线视频观看| 日韩久久一区二区| 欧美成人aaa片一区国产精品| 一区二区三区精品| 日韩三级小视频| 色婷婷激情久久| 一级黄色大毛片| 日韩一区二区三区精品视频| 日韩中文字幕免费观看| 日韩成人在线网站| youjizz在线播放| 久久九九免费视频| 精品精品导航| 日本久久久久久久久| 91九色综合| 国产精品免费一区二区三区四区 | 97久久综合区小说区图片区| 久久视频在线观看中文字幕| 日韩中文字幕高清在线观看| 加勒比海盗1在线观看免费国语版| 一区二区国产精品| 天天色综合社区| 国产suv精品一区二区6| 久久精品成人av| 亚洲免费伊人电影| 日本韩国欧美中文字幕| 欧美美女网站色| 色屁屁草草影院ccyycom| 在线日韩日本国产亚洲| 黄网av在线| 国产精品视频精品| 一区二区三区四区精品视频| 日韩欧美视频一区二区三区四区| 亚洲人metart人体| 日韩欧美xxxx| 成人中文字幕电影| 成人小视频免费看| 亚洲妇女屁股眼交7| 亚洲综合精品国产一区二区三区| 亚洲大胆人体av| 暖暖日本在线观看| 欧美在线欧美在线| 香蕉大人久久国产成人av| 日本欧美精品久久久| 国产精品av久久久久久麻豆网| 亚洲精品高清无码视频| 成人av综合在线| 黑人狂躁日本娇小| 日韩欧美一区二区三区| 精品人妻一区二区三区换脸明星 | 天天综合色天天综合色hd| 极品少妇一区二区三区| wwwwwxxxx日本| 国产亚洲欧美中文| 国产一级片免费| 欧美剧情片在线观看| 黄色在线视频观看网站| 久久久久久亚洲| 精品一区二区三区亚洲| 日韩在线国产| 视频一区二区三区在线| 天天插天天射天天干| 亚洲国产日韩a在线播放性色| 亚洲一卡二卡在线| 怡红院精品视频| 在线观看爽视频| 精品国产乱码久久久久久108| 亚洲欧洲美洲一区二区三区| 国产91色在线观看| 国产欧美一区二区在线| 亚洲 欧美 日韩 在线| 亚洲精品国产精品国自产观看浪潮| av免费在线观看网址| 成人午夜激情网| 亚洲成人二区| 欧美又黄又嫩大片a级| 中文字幕亚洲综合久久菠萝蜜| 中文字幕乱伦视频| 国产午夜精品视频| av在线日韩| 日韩av电影免费在线观看| 老司机精品视频网站| 国产中年熟女高潮大集合| 色偷偷久久人人79超碰人人澡| 男人的天堂在线| 国产mv久久久| 精品一区电影| 欧美日韩一区二区三区69堂| 亚洲国产成人午夜在线一区| 免费在线不卡av| 日韩一区二区三区国产| 日韩五码电影| 欧美与动交zoz0z| 国产精品1区2区3区在线观看| 午夜精品一区二区三级视频| 欧美一区在线视频| 91亚洲天堂| 国产麻豆日韩| 国产亚洲综合精品| 亚洲熟妇一区二区三区| 欧美在线你懂得| 欧美a免费在线| 99视频网站| av成人黄色| 亚洲一区二区自偷自拍| 91超碰这里只有精品国产| 超碰porn在线| 精品国产一区二区三区四区精华 | 亚洲一区二区精品久久av| 色婷婷av一区二区三| 日本一本a高清免费不卡| 久久性感美女视频| 日韩a一级欧美一级| 亚洲电影第三页| 日韩欧美亚洲系列| 国产精品永久免费观看| 一区二区影视| 黄色工厂在线观看| 欧美视频一二三区| 毛片在线网址| 日韩精品伦理第一区| 国产高清不卡一区| 秋霞精品一区二区三区| 少妇高潮久久77777| 成人午夜三级| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 中文字幕一区视频| 日韩永久免费视频| 国产精品视频网址| 亚洲激情专区| 成人一级黄色大片| 亚洲国模精品私拍| 综合久久av| www.中文字幕在线| 曰韩精品一区二区| 国产一区精品| 粉嫩精品一区二区三区在线观看 | 亚洲第一伊人| 很污很黄的网站| 国产视频精品久久久| 免费精品一区| 手机视频在线观看|