Promise、Generator 函數(shù)

Promise對(duì)象是一個(gè)構(gòu)造函數(shù),用來(lái)生成Promise實(shí)例
var promise = new Promise((resolve, reject) => {
// 異步操作,如調(diào)個(gè)api
      if (/* 異步操作成功 */){
        resolve(value);
    } else {
        reject(error);
     }
})

resolve函數(shù)改變promise狀態(tài)從Pending(未完成)變?yōu)镽esolved
reject函數(shù)從Pending變?yōu)镽ejected

promise實(shí)例的then方法

作用: 指定Resolved狀態(tài)和Reject狀態(tài)的回調(diào)函數(shù)

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});
Generator函數(shù)

協(xié)程的方式解決異步問(wèn)題

第一步,協(xié)程A開(kāi)始執(zhí)行。
第二步,協(xié)程A執(zhí)行到一半,進(jìn)入暫停,執(zhí)行權(quán)轉(zhuǎn)移到協(xié)程B。
第三步,(一段時(shí)間后)協(xié)程B交還執(zhí)行權(quán)。
第四步,協(xié)程A恢復(fù)執(zhí)行。

上面流程的協(xié)程A,就是異步任務(wù),因?yàn)樗殖蓛啥危ɑ蚨喽危﹫?zhí)行。
Generator函數(shù)最大特點(diǎn)就是可以交出函數(shù)的執(zhí)行權(quán)(即暫停執(zhí)行)
它不是一個(gè)普通的函數(shù),函數(shù)名之前要加星號(hào)如

function*  gen(x){
    var y = yield x + 2;
    return y
}

Generator函數(shù)的執(zhí)行

var g = get(1);
g.next(); // { value: 3, done: false }
g.next(); // { value: undefined, done: true }
  1. 第一個(gè)next()方法,返回 x+2

yield語(yǔ)句本身沒(méi)有返回值,或者說(shuō)返回的是undefined
所以些時(shí)y是undefined

  1. 第二個(gè)next()方法,返回return后面的值y,所以它是undefined

每次調(diào)用next方法時(shí)指針從函數(shù)頭部或上一次停下來(lái)的地方開(kāi)始執(zhí)行,直到遇到下一個(gè)yield語(yǔ)句(或return語(yǔ)句)為止

next 方法
  1. 遇到y(tǒng)ield這個(gè)關(guān)鍵詞時(shí),就將跟在它后面的表達(dá)式的值,作為返回對(duì)象的value的值

  2. 下一次調(diào)用next方法時(shí),再繼續(xù)往下執(zhí)行,直到遇到下一個(gè)yield語(yǔ)句。

  3. 如果沒(méi)有再遇到新的yield語(yǔ)句,就一直運(yùn)行到函數(shù)結(jié)束,直到return語(yǔ)句為止,并將return語(yǔ)句后面的表達(dá)式的值,作為返回的對(duì)象的value屬性值。

  4. 如果該函數(shù)沒(méi)有return語(yǔ)句,則返回的對(duì)象的value屬性值為undefined。

正常函數(shù)只能返回一個(gè)值,因?yàn)橹荒軋?zhí)行一次return;Generator函數(shù)可以返回一系列的值,因?yàn)榭梢杂腥我舛鄠€(gè)yield。從另一個(gè)角度看,也可以說(shuō)Generator生成了一系列的值,這也就是它的名稱的來(lái)歷(在英語(yǔ)中,generator這個(gè)詞是“生成器”的意思)。

next 方法的參數(shù)

yield句本身沒(méi)有返回值,或者說(shuō)總是返回undefined。next方法可以帶一個(gè)參數(shù),該參數(shù)就會(huì)被當(dāng)作上一個(gè)yield語(yǔ)句的返回值
所以如果第一個(gè)next()方法我們加一個(gè)5的參數(shù)

g.next(5) // {value: 5, done: true}

這里第一個(gè)yield會(huì)把5給y,我們第二個(gè)再獲取時(shí),y就已經(jīng)是5了

因?yàn)榉祷氐氖堑谝粋€(gè)yield的返回值,所以第一個(gè)next()方法是不能帶參數(shù)的。

for of循環(huán)
function* gen() {
    yield 1;
    yield 2;
    yield 3;
    yield 4;
    yield 5;
    return 6
}

for(let i of gen()){
    console.log(i)
}

// 1,2,3,4,5

for of可以遍歷generator函數(shù),不需要調(diào)next,但是需要注意的是一旦next返回的done為true,它就停止了,并且連done為true的這個(gè)對(duì)象也不返回了

g.return() 方法

g.return('hello') 當(dāng)碰到這個(gè)時(shí)返回的對(duì)象是{value:'hello', done: true}
表示已經(jīng)對(duì)遍歷的終止

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在此處先列下本篇文章的主要內(nèi)容 簡(jiǎn)介 next方法的參數(shù) for...of循環(huán) Generator.prototy...
    醉生夢(mèng)死閱讀 1,486評(píng)論 3 8
  • 簡(jiǎn)介 基本概念 Generator函數(shù)是ES6提供的一種異步編程解決方案,語(yǔ)法行為與傳統(tǒng)函數(shù)完全不同。本章詳細(xì)介紹...
    呼呼哥閱讀 1,135評(píng)論 0 4
  • 本文作者就是我,簡(jiǎn)書(shū)的microkof。如果您覺(jué)得本文對(duì)您的工作有意義,產(chǎn)生了不可估量的價(jià)值,那么請(qǐng)您不吝打賞我,...
    microkof閱讀 23,849評(píng)論 16 78
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,446評(píng)論 9 19
  • 特別說(shuō)明,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 737評(píng)論 0 1

友情鏈接更多精彩內(nèi)容