前言
同步與異步最直觀的理解:等到操作執(zhí)行完成才返回執(zhí)行結(jié)果的是同步操作助琐;反之哩俭,則是異步操作
傳統(tǒng)的異步編程方法:
- 回調(diào)函數(shù)
- 事件監(jiān)聽
- 發(fā)布/訂閱
- Promise 對(duì)象
ES6異步編程方法:
- Generator函數(shù)
- Thunk函數(shù)
- co函數(shù)庫(kù)
- async函數(shù)
一播歼、Promise對(duì)象
1、什么是Promise對(duì)象
Promise對(duì)象是處理異步請(qǐng)求的對(duì)象。
- 可理解為對(duì)一個(gè)異步操作的承諾(promise),成功了(resolve)怎么怎么樣猪狈,失敗了(reject)怎么怎么樣
Promise對(duì)象是一個(gè)代理對(duì)象箱沦。
- 通過(guò)Promise對(duì)象辩恼,對(duì)一個(gè)異步操作的成功和失敗分別綁定對(duì)應(yīng)的處理方法,使得可以像調(diào)用同步操作一樣調(diào)用異步操作谓形,并返回一個(gè)能代表未來(lái)出現(xiàn)的結(jié)果的Promise對(duì)象灶伊。
2、語(yǔ)法
new Promise(
/* executor */
function(resolve, reject) {...}
);
- executor是一個(gè)帶有resolve和reject兩個(gè)參數(shù)的函數(shù)寒跳。
- executor函數(shù)在構(gòu)造函數(shù)Promise執(zhí)行時(shí)同步執(zhí)行聘萨,并傳遞給resolve和reject函數(shù)(可理解為,executor 函數(shù)在Promise構(gòu)造函數(shù)返回新建對(duì)象前被調(diào)用童太,并在內(nèi)部執(zhí)行一些異步操作米辐,一旦完成,可以調(diào)用resolve函數(shù)來(lái)將promise狀態(tài)改成fulfilled书释,或者在發(fā)生錯(cuò)誤時(shí)將它的狀態(tài)改為rejected)翘贮。
3、用法
var promise = new Promise(function(resolve, reject) {
if (/* 異步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
promise.then(function(value) {
// success
}, function(value) {
// failure
});
promise.then(function(value){
//success
}).catch(function(err){
//error
});
4爆惧、鏈?zhǔn)綄懛?/strong> 1芍耘、什么是Generator函數(shù) Generator函數(shù)(生成器函數(shù))址遇。Generator函數(shù)是“可以返回多次的函數(shù)”,用yield返回多次 Generator函數(shù)不會(huì)返回執(zhí)行結(jié)果斋竞,而是返回一個(gè)遍歷器對(duì)象g倔约,調(diào)用 g 的 next 方法,會(huì)移動(dòng)內(nèi)部指針(即執(zhí)行異步任務(wù)的第一段)坝初,指向第一個(gè)遇到的 yield 語(yǔ)句跺株。 2蛆封、方法 3、數(shù)據(jù)交換 4围俘、錯(cuò)誤處理
promise的then方法返回一個(gè)Promise對(duì)象狸页,因此可以不斷的調(diào)用then方法,從而實(shí)現(xiàn)promise的鏈?zhǔn)綄懛ā?/p>
var promise = new Promise(function(resolve, reject){
setTimeout(function(){
resolve("成功1");
}, 2000);
});
var promise2 = new Promise(function(resolve, reject){
setTimeout(function(){
resolve("成功2");
}, 2000);
});
promise.then(function(mess){
console.log(mess);
}).then(function(){
return promise2;
}).then(function(mess2){
console.log(mess2)
}).catch(function(err){
console.log(err);
});
var promise = new Promise(function(resolve, reject){
setTimeout(function(){
resolve("成功1");
}, 2000);
});
promise.then(function(mess){
return mess;
}).then(function(mess){
console.log(mess+"1443")
}).catch(function(err){
console.log(err);
});
二 扯再、Generator函數(shù)
function* foo(x) {
yield x + 1;
yield x + 2;
return x + 3;
}
每次調(diào)用 next 方法,會(huì)返回一個(gè)對(duì)象脖卖,表示當(dāng)前階段的信息( value 屬性和 done 屬性)乒省。value 屬性是 yield 語(yǔ)句后面表達(dá)式的值,表示當(dāng)前階段的值畦木;done 屬性是一個(gè)布爾值袖扛,表示 Generator 函數(shù)是否執(zhí)行完畢,即是否還有下一個(gè)階段十籍。
返回一個(gè)由 yield表達(dá)式生成的值。
返回給定的值并結(jié)束生成器勾栗。
向生成器拋出一個(gè)錯(cuò)誤惨篱。function* gen(x){
var y = yield x + 2;
return y;
}
var g = gen(1);
g.next() // { value: 3, done: false }
g.next(2) // { value: 2, done: true }
function* gen(x){
try {
var y = yield x + 2;
} catch (e){
console.log(e);
}
return y;
}
var g = gen(1);
g.next();
g.throw('出錯(cuò)了');
// 出錯(cuò)了
三砸讳、AsyncFunction