- 什么是
Promise
称近? -
Promise
解決了什么問題纯赎? - 語法
一、什么是 Promise
励稳?
A Promise represents a
proxy
for a valuenot necessarily known
when the promise is created. It allows you to associate handlers to anasynchronous
action's eventual success value or failure reason. This lets asynchronous methods return values like synchronous methods: instead of the final value, the asynchronous method returns a promise of having a value at some pointin the future
通俗點(diǎn)說就是佃乘,Promise
相當(dāng)于一個(gè)代理(proxy),用于處理 Promise
對象 的返回值驹尼,但這個(gè)值在 Promise
創(chuàng)建時(shí)不是必須知道的趣避,可以用于異步(asynchronous)操作的返回值,在以后需要返回的時(shí)候用一個(gè) Promise
封裝好這個(gè)返回值
二新翎、Promise
解決了什么問題 程帕?
首先來看個(gè)例子(例1)
// 路由處理
var route_1 = router.get('/example1', function(data) {
process_1(data);
});
var route_2 = router.get('/example2', function(data) {
process_2(data);
});
var route_3 = router.get('/example3', function(data) {
process_3(data);
});
例1
這段代碼我們并不關(guān)心回調(diào)函數(shù)的執(zhí)行順序住练,所以代碼寫起來還是很清晰的
如果關(guān)心呢?那代碼將會寫成如下這樣(例2)
var route_1 = router.get('example1', function(data) {
process_1(data);
router_2 = router.get('example2', function(data) {
process_2(data);
router_3 = router.get('example3', function(data) {
process_3(data);
});
});
});
例2
這段代碼是強(qiáng)調(diào)先后順序的愁拭,如果回調(diào)只有幾層還好讲逛,一旦多起來,誰都不愿意看
看完 例1
岭埠、例2
盏混,我想大家大概知道為什么要有 Promise
的存在了
如果用 Promise
來實(shí)現(xiàn) 例2
,代碼將如下(例3)
// 路由處理
var route_1 = function(resolve, reject) {
router.get('example1', resolve(data));
};
var route_2 = function(resolve, reject) {
router.get('example2', resolve(data));
};
var route_3 = function(resolve, reject) {
router.get('example3', resolve(data));
};
// 相比于例2惜论,這里沒有了層層嵌套许赃,流程看起來也比較清晰
new Promise(route_1)
.then(function(data) {
process_1(data);
return new Promise(route_2);
})
.then(function(data) {
process_2(data);
return new Promise(route_3)
}).then(function(data) {
process_3(data);
});
因此,我認(rèn)為 Promise
存在的主要原因是為了應(yīng)對回調(diào)嵌套太深馆类,但應(yīng)該不僅局限于此
三图焰、語法
var promise = new Pormise(function(resolve, reject) {
// ......
});
通過 new
關(guān)鍵字實(shí)例化一個(gè) Promise
對象,該對象接受一個(gè)函數(shù)參數(shù)蹦掐,接受兩個(gè)參數(shù)技羔,第一個(gè)參數(shù)用于處理執(zhí)行成功時(shí)的情景,第二個(gè)參數(shù)用于處理執(zhí)行失敗的情景
Promise
對象的狀態(tài)有三種
- pending:處理中
- fulfilled:處理成功
- rejected:處理失敗
Promise
對象原型包含兩個(gè)方法卧抗,then(onFulfilled, onRejected)
和 catch(onRejected)
其中藤滥,then()
接受兩個(gè)參數(shù),第一個(gè)參數(shù)是在當(dāng)前 Promise
resolve 時(shí)進(jìn)行回調(diào)的方法社裆,第二個(gè)參數(shù)是 reject 時(shí)進(jìn)行回調(diào)的方法拙绊;catch()
相當(dāng)于 then(undefined, onRejected)
的語法糖。調(diào)用 then
和 catch
之后都會反回一個(gè) Promise
對象泳秀,利用這個(gè)特性标沪,可以輕松地實(shí)現(xiàn)鏈?zhǔn)?chain)調(diào)用
需要注意的一點(diǎn)事,回調(diào)方法 onFulfilled 及 onRejected
的返回值既可以是一個(gè) Promise
對象嗜傅,亦可以是其他值金句,比如
new Promise(step1)
.then(function(data) {
// ...
return new Promise(step2);
}).then(function(data) {
//..
return 1;
}).then(function(data) {
console.log(data);// 這里將輸出: 1
});
關(guān)于 then
的實(shí)現(xiàn),可以參考 這里
Promise
實(shí)例包含四個(gè)方法吕嘀,分別是 all()
违寞、race()
、reject()
偶房、resolve()
將在下一篇文章進(jìn)行說明