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 }
- 第一個(gè)next()方法,返回 x+2
yield語(yǔ)句本身沒(méi)有返回值,或者說(shuō)返回的是undefined
所以些時(shí)y是undefined
- 第二個(gè)next()方法,返回return后面的值y,所以它是undefined
每次調(diào)用next方法時(shí)指針從函數(shù)頭部或上一次停下來(lái)的地方開(kāi)始執(zhí)行,直到遇到下一個(gè)yield語(yǔ)句(或return語(yǔ)句)為止
next 方法
遇到y(tǒng)ield這個(gè)關(guān)鍵詞時(shí),就將跟在它后面的表達(dá)式的值,作為返回對(duì)象的value的值
下一次調(diào)用next方法時(shí),再繼續(xù)往下執(zhí)行,直到遇到下一個(gè)yield語(yǔ)句。
如果沒(méi)有再遇到新的yield語(yǔ)句,就一直運(yùn)行到函數(shù)結(jié)束,直到return語(yǔ)句為止,并將return語(yǔ)句后面的表達(dá)式的值,作為返回的對(duì)象的value屬性值。
如果該函數(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ì)遍歷的終止