javascript
学JS的心路历程-Promise(一)
今天在進入Promise代碼之前,我們先來用個例子來解釋Promise是什么。
?
未來值
假設我們今天來到快餐店,點了一個漢堡,付錢給店員。
點了餐點并付費,可以理解為我們發(fā)送了一個請求,希望得到一個回傳值(也就是漢堡)。
?
不過常見情況是,漢堡還沒做好,不能立即給我,店員給了我一張收據(jù)上面寫著點餐號碼。這個點餐號碼是一種「我欠你」的承諾(promise),確保我最后能夠拿到我的漢堡。
?
所以只要拿著收據(jù),我就能確保我未來的漢堡,不需要去擔心。這樣在等待的同時我就能夠做其他事情,像是滑手機。
?
直到店員喊了我的號碼,我拿著我的收據(jù)到柜臺給店員換得了我的漢堡。
換句話說,一旦未來值準備就緒,我就能夠用手上對值的承諾(value-promise)交換那個值本身。
但還有另一種結(jié)果,就是叫了我的號碼,我走過去后店員跟我說漢堡賣完了。
這時候我們可以看到未來值一個重要的特性:代表成功,也可能代表失敗。
?
也就是說Promise物件的設計就是針對異步函式的執(zhí)行結(jié)果所設計的,最后的結(jié)果要不然就用一個回傳值來fulfilled(實現(xiàn)),要不然就用一個理由(錯誤)來rejected(拒絕)。
?
那到底要怎么用呢?首先我們要先建立一個Promise物件:
?
var promise = new Promise(function(resolve,reject){
//成功時
resolve(value)
//失敗時
reject(reason)
});
?
promise.then(function(value){
// on fulfillment(已實現(xiàn)時)
},function(reason){
// on rejection(已拒絕時)
})
建構(gòu)式傳入?yún)?shù)需要一個函式,稱為executor有強烈執(zhí)行的意味,當傳入這個函式時,會在建構(gòu)式回傳物件實體前立即執(zhí)行,也就是說Promise會立即決定里面的狀態(tài),resolve或reject,兩者都必須是函式類型。
成功執(zhí)行resolve(value)而Promise物件的狀態(tài)會跑到fulfilled狀態(tài)固定住(cumminsathletic);
失敗或是發(fā)生錯誤時執(zhí)行reject(reason)而Promise物件的狀態(tài)會跑到rejected狀態(tài)固定住。
?
也因為與一般物件實體化過程不太一樣,所以通常會先包在一個函式中,需要使用時再呼叫函式來產(chǎn)生Promise物件:
?
function generatePromise(value){
return new Promise(function(resolve,reject){
if(value)
resolve(value)//已實現(xiàn),成功
else
reject(reason)//有錯誤,已拒絕,失敗
});
}
再來剛剛上面示例有看到說promise后面接著then。那then是什么呢?
?
then
then在Promise標準中是一個重要的方法,代表「然后、接著或接下來」的意思。then方法物件被稱為thenable物件,我們來看個示例:
?
promise.then(onFulfilled,onRejected);
?
promise.then(function(value){
// fulfillment
},function(reason){
// rejection
});
then一樣用兩個函式當作參數(shù)傳入,onFulfilled和onRejected。onFulfilled是當Promise物件狀態(tài)轉(zhuǎn)為fulfilled時呼叫的函式,會有一個傳入?yún)?shù)值value可用;onRejected則是Promise物件狀態(tài)轉(zhuǎn)為rejected時呼叫,會有一個傳入?yún)?shù)值reason可用。
?
而在最后,then會回傳另一個「新的Promise物件」。
?
講了那么多概念上的東西是不是令人難以理解?沒關(guān)系,這邊用個實際示例來講解:
?
var promise = new Promise(function(resolve,reject){
resolve(1)
})
?
promise
.then(function(value){
console.log(value)// 1
return value + 1
})
.then(function(value){
console.log(value)// 2
})
then方法中的onFulfilled函式,也就是第一個傳入的函式參數(shù),它是有值時使用的函式,經(jīng)過連鎖的結(jié)構(gòu),如果要把值往下傳遞,可以用回傳值的方式,讓這個值可以繼續(xù)的往下面的then方法傳送。
?
那如果不用Promise,直接用callback會怎么樣呢?
?
function doA(doB){
doB(1,doC)
}
function doB(val,doC){
doC(val+1)
}
function doC(val){
console.log(val);
}
doA(doB);
是不是看起來有點痛苦,而且我們還沒加上如果失敗時的函式呢(bargaintravel4u)!
?
今天就先到這邊,如果有錯誤歡迎留言指正,明天會說明Promise失敗時的函式用法!
轉(zhuǎn)載于:https://www.cnblogs.com/lannyQ-Q/p/9985846.html
總結(jié)
以上是生活随笔為你收集整理的学JS的心路历程-Promise(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RuntimeError: dictio
- 下一篇: 站立会议(11月19日)