成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

async/await 真不是你想象中那么簡(jiǎn)單

zsy888 / 841人閱讀

摘要:第二種方法一開(kāi)始就發(fā)起了個(gè)請(qǐng)求并等待請(qǐng)求都到達(dá)后獲取數(shù)據(jù)。請(qǐng)求返回的數(shù)據(jù)秒后就能操作了這種方法比第二種方法可以更快處理數(shù)據(jù)。如果請(qǐng)求時(shí)間是依次遞減的那么和方法二效果是一樣在有多個(gè)請(qǐng)求時(shí)這種情況一般不存在。

先上代碼

公共代碼
function getData(data, time) {
                return new Promise(function (resolve, reject) {
                    setTimeout(function () {
                        resolve(data);
                    }, time)
                })
            }
            let results = [];
            let startTime = new Date();
            laucher();
代碼段一
   async function laucher() {
                let dataA = await getData("a", 2000);
                results.push(`${dataA}在${new Date() - startTime}毫秒放入`);
                let dataB = await getData("b", 3000);
                results.push(`${dataB}在${new Date() - startTime}毫秒放入`);
                let dataC = await getData("c", 1000);
                results.push(`${dataC}在${new Date() - startTime}毫秒放入`);
                console.log(results, `輸出時(shí)間${new Date() - startTime}毫秒`);
            }
            

輸出

["a在2002毫秒放入", "b在5004毫秒放入", "c在6006毫秒放入"] "輸出時(shí)間6006毫秒"
代碼段二
 async function laucher() {
              let dataAPromise = getData("a", 2000);
              let dataBPromise = getData("b", 3000);
              let dataCPromise = getData("c", 1000);
              let promises = [dataAPromise, dataBPromise, dataCPromise];
              results = await Promise.all(promises);
              console.log(results, `輸出時(shí)間${new Date() - startTime}毫秒`);
            }

輸出

["a", "b", "c"] "輸出時(shí)間3006毫秒"
代碼段三
           async function laucher() {
              let dataAPromise = getData("a", 2000);
              let dataBPromise = getData("b", 3000);
              let dataCPromise = getData("c", 1000);
              dataA = await dataAPromise;
              results.push(`${dataA}在${new Date() - startTime}毫秒放入`);
              dataB = await dataBPromise;
              results.push(`${dataB}在${new Date() - startTime}毫秒放入`);
              dataC = await dataCPromise;
              results.push(`${dataC}在${new Date() - startTime}毫秒放入`);
              console.log(results, `輸出時(shí)間${new Date() - startTime}毫秒`);
            }

輸出

["a在2003毫秒放入", "b在3001毫秒放入", "c在3001毫秒放入"] "輸出時(shí)間3002毫秒"
代碼段四
     async function laucher() {
              let dataAPromise = getData("a", 2000);
              let dataBPromise = getData("b", 3000);
              let dataCPromise = getData("c", 1000);
              (async () => {
                dataA = await dataAPromise;
                results.push(`${dataA}在${new Date() - startTime}毫秒放入`);
              })();
              (async () => {
                dataB = await dataBPromise;
                results.push(`${dataB}在${new Date() - startTime}毫秒放入`);
                console.log(results, `輸出時(shí)間${new Date() - startTime}毫秒`);//results放在最后返回的請(qǐng)求中
              })();
              (async () => {
                dataC = await dataCPromise;
                results.push(`${dataC}在${new Date() - startTime}毫秒放入`);
              })();
            }

輸出

["c在1002毫秒放入", "a在2002毫秒放入", "b在3003毫秒放入"] "輸出時(shí)間3003毫秒"
總結(jié)

使用setTimeout模擬了3條異步請(qǐng)求,分別2000,3000,1000毫秒后返回"a", "b", "c",
第一種方法很好理解,就是一步一步執(zhí)行,這種方法適合請(qǐng)求參數(shù)依賴上一個(gè)請(qǐng)求返回值的情況,在這里是不存在這種關(guān)系的,也就是這種方法在這里效率是比較低的。

第二種方法一開(kāi)始就發(fā)起了3個(gè)請(qǐng)求,并等待3請(qǐng)求都到達(dá)后獲取數(shù)據(jù)。

第三種方法也一開(kāi)始就發(fā)起了3個(gè)請(qǐng)求,并在請(qǐng)求到達(dá)后依次執(zhí)行,因?yàn)閍請(qǐng)求到達(dá)時(shí)間是2秒,a請(qǐng)求到達(dá)后,把a(bǔ)的結(jié)果推入results,再往下執(zhí)行,b請(qǐng)求是3秒,b請(qǐng)求遲a請(qǐng)求一秒到達(dá),也就是再過(guò)一秒后把b的結(jié)果推入results,,c的請(qǐng)求是1秒,這個(gè)時(shí)候c早已到達(dá),在這輪循環(huán)末尾可以立即把c推入。a請(qǐng)求返回的數(shù)據(jù)2秒后就能操作了,這種方法比第二種方法可以更快處理數(shù)據(jù)。如果請(qǐng)求時(shí)間是依次遞減的,那么和方法二效果是一樣,在有多個(gè)請(qǐng)求時(shí)這種情況一般不存在。

第四種方法和第三種方法的區(qū)別是最先到達(dá)的請(qǐng)求最快放入結(jié)果集,也就是我不用排隊(duì)等待處理,哪個(gè)數(shù)據(jù)先返回我就先處理哪個(gè)數(shù)據(jù),假如c請(qǐng)求返回的數(shù)據(jù)需要花比較長(zhǎng)的時(shí)間處理,我在一秒后就能開(kāi)始處理了,但是第三種方法我得3秒后才能開(kāi)始處理??梢钥吹轿野裷esults的輸出放在了b請(qǐng)求到達(dá)的函數(shù)中,因?yàn)閞esults在最后一個(gè)請(qǐng)求到達(dá)后才能完整輸出,與方法三的區(qū)別是獲取結(jié)果的操作也是異步的,這個(gè)很關(guān)鍵,也是和方法三最大的區(qū)別,通過(guò)在外層包裝一個(gè)自執(zhí)行函數(shù),可以防止await的操作權(quán)跳出laucher外部,從而并發(fā)發(fā)起3個(gè)獲取結(jié)果的操作??赡艽蠹視?huì)有疑問(wèn)假如我不清楚哪個(gè)請(qǐng)求最后到達(dá),那怎么獲取最后的results值,這種情況可以在外面包一個(gè)Promise.all,可以仔細(xì)看一下下面兩個(gè)函數(shù)的區(qū)別

  async function laucher() {
              let dataAPromise = getData("a", 2000);
              let dataBPromise = getData("b", 3000);
              let dataCPromise = getData("c", 1000);
              let promises = [dataAPromise, dataBPromise, dataCPromise];
              results = await Promise.all(promises);
              console.log(results, `輸出時(shí)間${new Date() - startTime}毫秒`);
            }

輸出

["a", "b", "c"] "輸出時(shí)間3003毫秒"
    async function laucher() {
              let dataAPromise = getData("a", 2000);
              let dataBPromise = getData("b", 3000);
              let dataCPromise = getData("c", 1000);
              let promises = [dataAPromise, dataBPromise, dataCPromise];
              results = await Promise.all(promises.map(async function (promise) {
                let data = await promise;
                console.log(`${data}在${new Date() - startTime}毫秒輸出`);
                //這里可以提前處理數(shù)據(jù)
                return data
              }));
              console.log(results);
            }

輸出

c在1002毫秒輸出
a在2003毫秒輸出
b在3003毫秒輸出
["a", "b", "c"] "輸出時(shí)間3004毫秒"

如果請(qǐng)求之間不存在繼發(fā)關(guān)系,并且請(qǐng)求到達(dá)后要執(zhí)行一些運(yùn)算,那么按效率來(lái)說(shuō)
方法4 > 方法3 > 方法2 > 方法1
每種方法都對(duì)應(yīng)一種加載的策略,以一個(gè)使用場(chǎng)景來(lái)說(shuō)明一下,向后臺(tái)加載頁(yè)面組件(假設(shè)組件個(gè)數(shù)是3)
執(zhí)行流程:

方法一: 發(fā)起組件1的請(qǐng)求 -> 組件1數(shù)據(jù)到達(dá)后渲染組件1 -> 發(fā)起組件2的請(qǐng)求 -> 組件2數(shù)據(jù)到達(dá)后渲染組件2 -> 發(fā)起組件3的請(qǐng)求 -> 組件3數(shù)據(jù)到達(dá)后渲染組件3

方法二: 同時(shí)發(fā)起組件1,2,3的請(qǐng)求 -> 組件1,2,3的數(shù)據(jù)都到達(dá)后渲染組件1,2,3

方法三: 同時(shí)發(fā)起組件1,2,3的請(qǐng)求 -> 組件1數(shù)據(jù)到達(dá)后渲染組件1 -> 組件2數(shù)據(jù)到達(dá)后渲染組件2 -> 組件3數(shù)據(jù)到達(dá)后渲染組件3

方法四: 同時(shí)發(fā)起組件1,2,3的請(qǐng)求 -> 最快到達(dá)的組件數(shù)據(jù)到達(dá)后渲染最快到達(dá)的組件 -> 第二快到達(dá)的組件數(shù)據(jù)到達(dá)后渲染第二快到達(dá)的組件 -> 最慢到達(dá)的組件數(shù)據(jù)到達(dá)后渲染最慢到達(dá)的組件

針對(duì)以上場(chǎng)景可以看出方法四可以讓我們的頁(yè)面最快渲染出內(nèi)容

最后

可以看出雖然引入async/await,可以讓你的代碼很精簡(jiǎn),但是async/await本身的執(zhí)行流程卻是很復(fù)雜的,下面的代碼你可以猜一下輸出結(jié)果(補(bǔ)充一點(diǎn):有的文章會(huì)指出forEach函數(shù)不能放入異步操作,這種結(jié)論是錯(cuò)誤的,如果是繼發(fā)關(guān)系確實(shí)不適宜用forEach,但不能表示不能放入異步操作,反而這種操作能提高獲取數(shù)據(jù)的效率)

 [1, 2].forEach(async function (value) {
              console.log(value);
              await console.log("a");
              console.log("c");
              await console.log("d");
              console.log("e");
            })
            console.log(3);

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/115679.html

相關(guān)文章

  • async/await 不是想象那么簡(jiǎn)單

    先上代碼 公共代碼 function getData(data, time) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(data); ...

    CoXie 評(píng)論0 收藏0
  • async/await 不是想象那么簡(jiǎn)單

    摘要:第二種方法一開(kāi)始就發(fā)起了個(gè)請(qǐng)求并等待請(qǐng)求都到達(dá)后獲取數(shù)據(jù)。請(qǐng)求返回的數(shù)據(jù)秒后就能操作了這種方法比第二種方法可以更快處理數(shù)據(jù)。如果請(qǐng)求時(shí)間是依次遞減的那么和方法二效果是一樣在有多個(gè)請(qǐng)求時(shí)這種情況一般不存在。 先上代碼 公共代碼 function getData(data, time) { return new Promise(function (resol...

    mylxsw 評(píng)論0 收藏0
  • ES6 Async/Await 完爆Promise的6個(gè)原因

    摘要:以往的異步方法無(wú)外乎回調(diào)函數(shù)和。當(dāng)然,對(duì)這個(gè)新特性也有一定的擔(dān)心,體現(xiàn)在他使得異步代碼變的不再明顯,我們好不容易已經(jīng)學(xué)會(huì)并習(xí)慣了使用回調(diào)函數(shù)或者來(lái)處理異步。 自從Node的7.6版本,已經(jīng)默認(rèn)支持async/await特性了。如果你還沒(méi)有使用過(guò)他,或者對(duì)他的用法不太了解,這篇文章會(huì)告訴你為什么這個(gè)特性不容錯(cuò)過(guò)。本文輔以大量實(shí)例,相信你能很輕松的看懂,并了解Javascript處理異步的...

    shevy 評(píng)論0 收藏0
  • ES6 Async/Await 完爆Promise的6個(gè)原因

    摘要:以往的異步方法無(wú)外乎回調(diào)函數(shù)和。當(dāng)然,對(duì)這個(gè)新特性也有一定的擔(dān)心,體現(xiàn)在他使得異步代碼變的不再明顯,我們好不容易已經(jīng)學(xué)會(huì)并習(xí)慣了使用回調(diào)函數(shù)或者來(lái)處理異步。 自從Node的7.6版本,已經(jīng)默認(rèn)支持async/await特性了。如果你還沒(méi)有使用過(guò)他,或者對(duì)他的用法不太了解,這篇文章會(huì)告訴你為什么這個(gè)特性不容錯(cuò)過(guò)。本文輔以大量實(shí)例,相信你能很輕松的看懂,并了解Javascript處理異步的...

    W4n9Hu1 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<