async 原理很難腕柜? 25行搞定

注視都寫到了代碼里面,方面解釋和理解矫废!

const {
    log
} = console
// 先來看一下迭代器
// for await 
const testAsync = (tips, time = 1000) => new Promise(res => setTimeout(() => res(tips), time))
/**
 * for await ES2020新增
 */
let arr = [testAsync('我', 1000), testAsync('出', 2000), testAsync('現(xiàn)', 3000), testAsync('了', 4000)]
async function par1(a) {
    for await (let key of a) {
        log(key)
    }
}
// par1(arr) // 測試可打開

// 看起來更便捷了吧 -- ES7
async function par2(a) {
    for (let key of a) {
        let res = await key
        log(res, key)
        // 就是then的簡化版而已
        // key.then(res => {
        //     log(res)
        // })
    }
}

// par2(arr) // 測試可打開

// 先來看下genertor是什么玩意盏缤! 除去權(quán)威指南版本,全程自我理解

function* genertorStudy() {
    let data1 = yield testAsync('第一步')
    log(data1, '我執(zhí)行了')
    let data2 = yield testAsync('第二步了')
    log(data2, '又被執(zhí)行了')
    return '啊波次的呢'
}
// 以下就是(asnyc)雛形;只不過是手動化的 
let pCor = genertorStudy(); // 創(chuàng)建生成器
// log(pCor) // Object [Generator] {}
let pOne = pCor.next(); // 執(zhí)行下次Func
// log(pOne) //  { value: Promise { <pending> }, done: false } 第一次執(zhí)行到 yield 第一步 的promise蓖扑, so 可以拿到$.value.then這個api
pOne.value.then(resV => {
    // log(resV) // log -> 第一步 /////// 這個console 是可以拿到promise的值的; 這個log執(zhí)行的是 yield testAsync('第一步')
    // 這里并沒有當(dāng)做參數(shù)進(jìn)行返回到 data1 的, 所以現(xiàn)在還未執(zhí)行 36行 "log(data1)"
    let pTwo = pCor.next(resV) // 36行 log(data1, '我執(zhí)行了') ->  "第一步 我執(zhí)行了"  //////// 這邊"pCor.next(resV)"直接把參數(shù)返回給了賦值data1, 注意 這里是 "pCor.next";這有生成器的next傳入?yún)?shù)唉铜,才回把值返回給等號(=)左側(cè)
    // console.log(pTwo) // log -> { value: Promise { <pending> }, done: false } //// 這里直接拿到下一次的異步 
    pTwo.value.then(resv2 => {
        // log(resv2) //log -> 第二步了 //// 這里拿到 37行第二個promise的執(zhí)行結(jié)果; 為賦值給data2
        let pThree = pCor.next(resv2) // log -> 第二步了 又被執(zhí)行了 //// 執(zhí)行了38行代碼 依舊調(diào)用pCor
        // log(pThree) // log -> { value: '啊波次的呢', done: true } //// 注意這里的done 變?yōu)閠rue了 也就是說這個Genertor執(zhí)行到此結(jié)束
        if (pThree.done) {
            pCor.next(pThree.value)
            log(pThree.value) // 返回出去并打印
        }

    })
})
// 下面要把以上內(nèi)容變成自動化, 如有不理解請對比綜上代碼!
/**
 * 下面就是全部的async的原理代碼了
 * @param {*} fn 
 * @returns 
 */
function _asyncToGenerator(fn) {
    return function () {
        var gen = fn.apply(this, arguments);
        return new Promise(function (resolve, reject) {
            function step(key, arg) {
                try {
                    var info = gen[key](arg);
                    var value = info.value;
                } catch (error) {
                    return reject(error);
                }
                console.log(value)
                if (info.done) { // genertor 的 返回值 done 代表全部執(zhí)行完成
                    resolve(value);
                } else {
                    return Promise.resolve(value).then(function (value) {
                        return step("next", value);
                    }, function (err) {
                        return step("throw", err);
                    });
                }
            }
            return step("next");
        });
    };
}
export default _asyncToGenerator
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末律杠,一起剝皮案震驚了整個濱河市潭流,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柜去,老刑警劉巖灰嫉,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诡蜓,居然都是意外死亡熬甫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蔓罚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椿肩,“玉大人,你說我怎么就攤上這事豺谈≈O螅” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵茬末,是天一觀的道長厂榛。 經(jīng)常有香客問我盖矫,道長,這世上最難降的妖魔是什么击奶? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任辈双,我火速辦了婚禮,結(jié)果婚禮上柜砾,老公的妹妹穿的比我還像新娘湃望。我一直安慰自己,他們只是感情好痰驱,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布证芭。 她就那樣靜靜地躺著,像睡著了一般担映。 火紅的嫁衣襯著肌膚如雪废士。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天蝇完,我揣著相機與錄音官硝,去河邊找鬼。 笑死四敞,一個胖子當(dāng)著我的面吹牛泛源,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忿危,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼达箍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铺厨?” 一聲冷哼從身側(cè)響起缎玫,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎解滓,沒想到半個月后赃磨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡洼裤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年邻辉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腮鞍。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡值骇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出移国,到底是詐尸還是另有隱情吱瘩,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布迹缀,位于F島的核電站使碾,受9級特大地震影響蜜徽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜票摇,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一拘鞋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兄朋,春花似錦掐禁、人聲如沸怜械。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缕允。三九已至峡扩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間障本,已是汗流浹背教届。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驾霜,地道東北人案训。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像粪糙,于是被迫代替她去往敵國和親强霎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容