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

資訊專欄INFORMATION COLUMN

用各種方式實現(xiàn)同步for循環(huán)輸出(yeild, await...)

JayChen / 2476人閱讀

摘要:前段的功能越來越強大,現(xiàn)在實現(xiàn)同步的循環(huán)輸出的方式也越來越多,我們先看一個例子后輸出相信大家對這個比較常見了,原理是因為聲明的為的局部變量,只是定時器,他暫時將內(nèi)部函數(shù)掛起,等到一秒后執(zhí)行,到那個時候,已經(jīng)變成了。后續(xù)會更新,歡迎補充

前段的功能越來越強大,現(xiàn)在實現(xiàn)同步的for循環(huán)輸出的方式也越來越多,我們先看一個例子:

forF();
function forF() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function () {
      console.log(i);
    }, 1000)
  }
}
// 1s后輸出:3 3 3

相信大家對這個比較常見了,原理是因為var聲明的i為forF的局部變量,setTimeout只是定時器,他暫時將內(nèi)部函數(shù)掛起,等到一秒后執(zhí)行,到那個時候,i已經(jīng)變成了5。

那么我們的解決辦法有哪些呢?

先上一個es5以前的解決辦法:

forF();
function forF() {
  for (var i = 0; i < 3; i++) {
    outF(i);
  }
}

function outF(i) {
  setTimeout(function () {
    console.log(i);
  }, 1000*i)
}
// 0 1 2

因為在循環(huán)中用了外部函數(shù),那么相當于創(chuàng)建了三個outF實例,因為i是基本變量,所以每個實例的i都是不共享的,這里要注意設(shè)置的定時器時間要1000*i;

下面開始用es6的方法實現(xiàn)啦!
1.用塊作用域的let

forF();
function forF() {
  for (let i = 0; i < 3; i++) {
    setTimeout(function () {
      console.log(i);
    }, 1000*i)
  }
}

因為let是塊作用域的,對于setTimeout函數(shù)而言,每次循環(huán)都新創(chuàng)建一個i,每個i不共享

2.await(其實是es7的)
見代碼

var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve("ok");
        }, time);
    })
};
// // 用await實現(xiàn)循環(huán)輸出數(shù)字
async function awaitF() {
  for (var i = 0; i < 3; i++) {
    await sleep(1000);
    console.log(i)
  }
}
awaitF()
// 0 1 2

await顧名思義是等待,他接受一個promise對象,等待他相應(yīng)然后才繼續(xù)執(zhí)行。
注意用await的函數(shù)必須加async關(guān)鍵字
關(guān)于promise,推薦看大白話:https://www.cnblogs.com/lvdab...

3.yeild

function* countAppleSales () {
  for (var i = 0; i < 3; i++) {
    yield;
    console.log(i);
  }
}

var appleStore = countAppleSales(); // Generator { }
appleStore.next();
nextApp(appleStore);
function nextApp(appleStore) {
  setTimeout(function () {
    let done = appleStore.next().done;
    if (!done) {
      nextApp(appleStore);
    }
  }, 1000);
}

yield函數(shù)必須定義成function* 外部在調(diào)用此函數(shù)的時候必須用next()方法他才會繼續(xù)執(zhí)行到下個yeild那里,所以這里用遞歸去執(zhí)行。
關(guān)于yeild的知識點百度也很多,可自行百度。

后續(xù)會更新,歡迎補充

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

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

相關(guān)文章

  • 理解Koa洋蔥模型

    摘要:的嵌套就像是洋蔥模型的形狀就是一層包裹著一層,直到到最里面一層的的值返回。中間件引擎是有模塊來實現(xiàn)的,也就是實現(xiàn)洋蔥模型的核心引擎。表示遍歷還沒有結(jié)束。 中間件特性 | | | ...

    yearsj 評論0 收藏0
  • 異步等待的 Python 協(xié)程

    摘要:輔之以事件循環(huán),協(xié)程可用于異步處理,尤其是在中。當前支持的協(xié)程基于增強型生成器,于版本開始采用。新的特性中,異步還有兩種新用途異步內(nèi)容管理器和迭代器。 現(xiàn)在 Python 已經(jīng)支持用協(xié)程進行異步處理。但最近有建議稱添加協(xié)程以全面完善 Python 的語言結(jié)構(gòu),而不是像現(xiàn)在這樣把他們作為生成器的一個類型。此外,兩個新的關(guān)鍵字———異步(async)和等待(await),都該添加到 Pyt...

    NicolasHe 評論0 收藏0
  • 【JS基礎(chǔ)】ES6語法

    摘要:遍歷器對象調(diào)用方法后,拋出的異常被函數(shù)體捕獲以后,會附帶執(zhí)行下一條語句。 iterator迭代器 在ES6之前遍歷數(shù)組的方法有以下四種: // 第一種 for(var i = 0; i < array.length; i++){ console.log(array[i]) } // 第二種 array.forEach(function(item,index){ cons...

    Maxiye 評論0 收藏0
  • 通讀Python官方文檔之協(xié)程、Future與Task

    摘要:所以在第一遍閱讀官方文檔的時候,感覺完全是在夢游。通過或者等待另一個協(xié)程的結(jié)果或者異常,異常會被傳播。接口返回的結(jié)果指示已結(jié)束,并賦值。取消與取消不同。調(diào)用將會向被包裝的協(xié)程拋出。任務(wù)相關(guān)函數(shù)安排協(xié)程的執(zhí)行。負責切換線程保存恢復(fù)。 Tasks and coroutines 翻譯的python官方文檔 這個問題的惡心之處在于,如果你要理解coroutine,你應(yīng)該理解future和tas...

    mgckid 評論0 收藏0
  • Javascript關(guān)于異步編程的發(fā)展

    摘要:前言轉(zhuǎn)簡體重新排版布局代碼全面使用并且直接附上輸出結(jié)果補充細節(jié)補充內(nèi)容增加例子說明新增和在遍歷情況下怎么使用上文講了關(guān)于執(zhí)行機制單線程同異步任務(wù)事件循環(huán)的知識點我們知道在某一時刻內(nèi)只能執(zhí)行特定的一個任務(wù)并且會阻塞其它任務(wù)執(zhí)行為了解決這個 前言 PS:2018/08/08 轉(zhuǎn)簡體2018/08/09 重新排版布局,代碼全面使用ES6并且直接附上輸出結(jié)果,補充細節(jié)2018/08/13 補充...

    princekin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<