精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一区二区三区在线免费视频| 蜜桃av一区二区在线观看| 日韩一区二区在线观看| a天堂资源在线观看| 污污网站免费在线观看| 日韩综合小视频| 欧美片一区二区三区| 自拍视频一区二区| 青青在线精品| 五月天精品一区二区三区| 日韩精品一区二区三区外面 | 日本私人网站在线观看| 六月丁香综合在线视频| 97精品在线观看| 天美传媒免费在线观看| 久久丝袜视频| 91精品国产一区二区三区香蕉| 福利视频一二区| 永久av在线| www.色综合.com| 成人黄色大片在线免费观看| 美日韩一二三区| 欧美一区二区三区另类| 国产亚洲精品一区二555| 肉丝美足丝袜一区二区三区四| 三级成人在线| 天天影视涩香欲综合网| 在线观看免费黄色片| 熟妇高潮一区二区三区| 狠狠色丁香婷综合久久| 国产精品人成电影在线观看| 国产精品自拍视频一区| 久久久久久久久99精品大| 亚洲精品自拍第一页| 麻豆免费在线观看视频| 伊人久久一区| 欧美日韩久久不卡| 北条麻妃av高潮尖叫在线观看| 精品精品导航| 亚洲综合视频在线| 99热都是精品| 婷婷成人激情| 中文av一区二区| 日韩高清av电影| 青青草超碰在线| 99久久精品免费看国产免费软件| 亚洲综合在线小说| 国产精品福利电影| 蜜桃av噜噜一区二区三区小说| 91国产精品电影| 国产一级在线观看视频| 欧美日韩日本国产亚洲在线 | 欧美1234区| 亚洲精品久久久久久国产精华液| a级黄色片网站| 天天综合视频在线观看| 中文字幕视频一区| 色乱码一区二区三区熟女| 国产日本在线| 欧美极品少妇xxxxⅹ高跟鞋| 欧美一区免费视频| av在线日韩国产精品| 欧美国产精品专区| 亚洲资源在线网| 大片免费在线观看| 伊人色综合久久天天| 国产欧美久久久久| freexxx性亚洲精品| 依依成人精品视频| 人妻夜夜添夜夜无码av| 亚洲十八**毛片| 91极品美女在线| 爱爱爱爱免费视频| 欧美一区在线观看视频| 亚洲第一av在线| 疯狂揉花蒂控制高潮h| 国产成人影院| 久久精品视频亚洲| 久久久精品国产sm调教网站| 亚洲激情婷婷| 欧美性在线视频| 在线视频1卡二卡三卡| 精品一区二区免费看| 国产欧美婷婷中文| 精品人妻久久久久一区二区三区| 成人久久视频在线观看| 欧洲成人一区二区| 黄色免费在线网站| 洋洋成人永久网站入口| 国产精品免费成人| 国产精品一级在线观看| 日韩精品欧美激情| av在线免费播放网址| 国内精品久久久久久久影视蜜臀 | 日本精品在线中文字幕| 91精品免费在线观看| 精品中文字幕在线播放 | 在线日韩av观看| 免费三片在线播放| 日韩二区三区在线观看| 99国产精品久久久久老师| 国产精品视频二区三区| 亚洲主播在线观看| 色哟哟精品视频| 操欧美女人视频| 中文字幕亚洲欧美日韩高清| 久久久综合久久久| 奇米精品一区二区三区四区 | 国模人体一区二区| 中文字幕精品在线不卡| 青青草精品视频在线| 日韩毛片网站| 亚洲人永久免费| 久久午夜无码鲁丝片| 免费日本视频一区| 九九九九九精品| 成人黄色在线电影| 在线看不卡av| 污污免费在线观看| 国产精品久久久久9999赢消| 青草成人免费视频| 女人18毛片一区二区三区| 国产精品久久久久久久久久免费看| 日韩精品在线视频免费观看| 欧洲亚洲精品| 国产亚洲在线播放| 91美女免费看| 成人的网站免费观看| 在线观看日韩羞羞视频| 色尼玛亚洲综合影院| 精品国产乱码久久久久久浪潮 | 国产精品久久久久7777婷婷| 色婷婷av一区二区三区之e本道| 亚洲欧美在线高清| 五月婷婷激情久久| 红桃成人av在线播放| 亚洲91av视频| 免费观看黄色av| 亚洲激情av在线| 日本少妇xxx| 欧美日韩理论| 91免费看蜜桃| 伊人手机在线| 精品日本一线二线三线不卡| 精品无码久久久久成人漫画| 激情都市一区二区| 在线免费一区| 96sao精品免费视频观看| 色婷婷**av毛片一区| 欧美日韩 一区二区三区| 久久精品亚洲乱码伦伦中文| 波多野结衣50连登视频| 爽爽窝窝午夜精品一区二区| 欧美亚洲国产视频| 久久这里精品| 欧美日韩一区视频| 影音先锋男人看片资源| 久久精品99国产精品日本| 亚洲成人午夜在线| 日韩综合av| 久久视频这里只有精品| av中文字幕在线免费观看| 一区二区三区精品视频在线| 人妻互换一二三区激情视频| 黄色成人在线网址| 好看的日韩精品| 韩日精品一区二区| 在线性视频日韩欧美| 国产又粗又大又黄| 一区二区三区在线免费视频| 这里只有精品在线观看视频| 首页综合国产亚洲丝袜| 日韩片电影在线免费观看| 欧美视频免费看| 久久视频国产精品免费视频在线| 精品国产乱码久久久久久蜜臀网站| 亚洲综合免费观看高清完整版在线| 一级少妇精品久久久久久久| 美女精品在线| 国产四区在线观看| 美女一区2区| 国产美女久久精品香蕉69| а√天堂资源地址在线下载| 亚洲国产精品久久久久秋霞不卡| 国产嫩bbwbbw高潮| 综合久久一区二区三区| 午夜免费福利影院| 日韩高清不卡在线| 黄色一级大片免费| 国产欧美日韩免费观看| 92看片淫黄大片看国产片| 两个人看的在线视频www| 国产一区二区三区丝袜 | 日韩av网址在线| 中文字幕乱码在线观看| 亚洲已满18点击进入久久| b站大片免费直播| 国产在线精品一区二区夜色| 91av资源网| 91精品一区二区三区综合在线爱| 精品久久久久久一区二区里番| 国语自产精品视频在线看抢先版结局| 精品视频9999| h视频网站在线观看| 亚洲精品一线二线三线无人区| 波多野结衣激情视频| 午夜精品在线看| 国产日产精品一区二区三区的介绍| 成人av影院在线| 一区二区三区四区毛片| 久久久久国产精品午夜一区| 毛片av在线播放| 日韩激情图片| 欧美一区视久久| 美女av一区| 成人自拍爱视频| 国产精品一区二区免费福利视频| 午夜精品一区二区三区av| 黄色视屏免费在线观看| 国产小视频91| 深夜福利视频一区| 精品国产一二三区| 国产精品久久久久久免费播放 | 亚洲少妇第一页| 99在线精品免费视频九九视| 女人床在线观看| 99热国内精品| 亚洲欧美一区二区原创| 国产精品欧美三级在线观看| 国产有色视频色综合| 亚洲日本va午夜在线电影| 成人av色在线观看| 欧美日韩五区| 热久久视久久精品18亚洲精品| 2001个疯子在线观看| 久久久欧美一区二区| 久久久久久久久免费视频| 最新的欧美黄色| www.av在线播放| 最近2019免费中文字幕视频三| 国产区高清在线| 国产一级揄自揄精品视频| 黑人与亚洲人色ⅹvideos| 亚洲欧美另类人妖| 黄色国产在线| 亚洲性无码av在线| 高清美女视频一区| 国产亚洲精品久久久久动| 国产h视频在线观看| 伊人一区二区三区久久精品| 成人欧美一区| 日韩三级成人av网| 国产原创在线观看| 欧美国产中文字幕| 1区2区在线| 热久久免费视频精品| 免费欧美电影| 国产精品午夜国产小视频| 色综合视频一区二区三区日韩| 国产精品一区=区| 伊人久久一区| 国产精品一区二区你懂得| 久久综合另类图片小说| 蜜桃欧美视频| 日韩www.| www.欧美黄色| 亚洲一区二区三区免费在线观看| 黄色片一级视频| 久久99精品久久久久久| 久久久久久无码精品人妻一区二区| 顶级嫩模精品视频在线看| 在线观看国产网站| 国产亚洲短视频| 欧美日韩午夜视频| 亚洲成人在线网站| 少妇又紧又色又爽又刺激视频| 88在线观看91蜜桃国自产| 亚洲美女综合网| 亚洲色图美腿丝袜| 91精品久久久久久粉嫩| 亚州成人av在线| 成人在线视频免费看| 444亚洲人体| 亚洲精品小区久久久久久| 亚洲狠狠婷婷综合久久久| 欧美片第1页综合| 国产aaa一级片| 国产真实乱偷精品视频免| 国产亚洲色婷婷久久99精品91| 中文字幕欧美国产| 久久精品视频9| 在线观看亚洲精品| 成人黄色免费视频| 一本一道久久a久久精品逆3p| 国产在线高清视频| 日av在线播放中文不卡| 日韩三级精品| 日韩欧美视频第二区| 亚洲视频中文| 成年网站在线播放| 99九九99九九九视频精品| 中国特黄一级片| 婷婷开心激情综合| 国产裸体无遮挡| 亚洲人在线视频| 欧美性猛片xxxxx免费中国 | 日韩视频一二区| 五月婷婷综合色| aa国产精品| 波多野结衣网页| 国产精品美日韩| 国语对白永久免费| 欧美变态凌虐bdsm| 久cao在线| 国产精品久久久久影院日本| 老司机aⅴ在线精品导航| 91成人在线视频观看| 日韩不卡在线观看日韩不卡视频| 亚洲av熟女高潮一区二区| 亚洲欧洲国产专区| 欧美日韩 一区二区三区| 日韩精品亚洲元码| 男女在线观看视频| 51蜜桃传媒精品一区二区| 999视频精品| 中文字幕第80页| 久久日韩精品一区二区五区| 国产中文字字幕乱码无限| 91精品国产91久久综合桃花| 日本在线天堂| 国产精品免费福利| 精品久久久久久久久久久aⅴ| a在线视频观看| 成人av免费在线观看| 久久成人在线观看| 91精品国产综合久久精品性色| 国产黄在线看| 欧洲成人免费aa| 少妇久久久久| 国产欧美高清在线| 久久免费看少妇高潮| 久久亚洲天堂网| 亚洲精品美女网站| 欧美激情网站| 鲁丝一区二区三区免费| 亚洲免费在线| 国产aⅴ激情无码久久久无码| 黄色一区二区在线| 欧美孕妇性xxxⅹ精品hd| 日本成人免费在线| 国产乱码精品一区二区三区四区| 日本成人在线免费视频| 国产欧美一区视频| 亚洲视屏在线观看| 中文字幕在线观看亚洲| 精品美女一区| 久久视频免费在线| 国产成人在线视频免费播放| 成人免费看片98| 日韩av影视综合网| 日韩一级二级| 中文字幕一区二区中文字幕| 国产伦精品一区二区三区免费 | 日本中文字幕伦在线观看| 91美女片黄在线观| 亚洲午夜一区| 国产精品无码午夜福利| 在线视频综合导航| 无遮挡的视频在线观看| 99在线免费观看视频| 亚洲激情婷婷| 国产91丝袜美女在线播放| 7777女厕盗摄久久久| 19禁羞羞电影院在线观看| 欧美影视一区二区| 国产一区二区导航在线播放| 五月天综合在线| 综合激情国产一区| 欧美日韩黄色| 欧美黄色免费影院| 中文字幕亚洲精品在线观看| 欧美在线精品一区二区三区| 国产91露脸中文字幕在线| 天天综合精品| 呦呦视频在线观看| 精品婷婷伊人一区三区三| 手机av在线播放| 免费观看国产成人| 国产在线视频精品一区| 国产一区二区99| 久久精品91久久香蕉加勒比| 极品束缚调教一区二区网站| 色国产在线视频| 午夜亚洲福利老司机| 91大神在线网站| 国产一区二区不卡视频| 蜜乳av一区二区三区| 日韩成年人视频| 久久精品国产亚洲一区二区| 精品日产乱码久久久久久仙踪林|