Promise的基本概念
promise屬于new出來的對象,它的存在代表了一個(gè)異步程序的成功或失敗
該對象有三種狀態(tài):
Pending(進(jìn)行中)
Resolved(已完成,又稱 Fulfilled)
Rejected(已失?。?/p>
只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無法改變這個(gè)狀態(tài)。
我們可以使用promise檢測ajax的請求狀態(tài),利用promise的成功狀態(tài)函數(shù),返回ajax請求到的數(shù)據(jù)。
舉個(gè)簡而易懂的例子:
> promise是承諾的意思,那我說如果RNG今天打贏了比賽,三天后我就去吃慶功宴,這樣就產(chǎn)生了兩種可能:
> 1.RNG贏了,我后天去吃慶功宴
> 2.RNG輸了,我還是要乖乖的敲代碼
承諾的正在進(jìn)行時(shí): 三天期間
承諾成功: 三天后,去吃慶功宴了
承諾失?。?三天后,沒有去吃慶功宴
原生js模仿promise的過程:
function fn(success,error){
? ? ? ? console.log("正在進(jìn)行時(shí)....")
? ? ? ? var t1,t2;
? ? ? ? t1 = setTimeout(() => {
? ? ? ? ? ? success();
? ? ? ? ? ? clearTimeout(t2)? //成功時(shí)清除失敗的計(jì)時(shí)器
? ? ? ? }, Math.random()*1000);
? ? ? ? t2 = setTimeout(() => {
? ? ? ? ? ? error()
? ? ? ? ? ? clearTimeout(t1)? //失敗時(shí)清除成功的計(jì)時(shí)器
? ? ? ? }, Math.random()*1000);
? ? }
? ? fn(function(){
? ? ? ? document.body.style.background = "green";
? ? },function(){
? ? ? ? document.body.style.background = "pink";
? ? });
ES6封裝好的promise
封裝好的promise是已經(jīng)做好了我們要手動(dòng)清除計(jì)時(shí)器的功能, 所以不需要再多此一舉了
? ? var p = new Promise(function(success,error){
? ? ? ? setTimeout(() => {
? ? ? ? ? ? success();
? ? ? ? }, Math.random()*1000)
? ? ? ? setTimeout(() => {
? ? ? ? ? ? error();
? ? ? ? }, Math.random()*1000)
? ? });
? ? p.then(function(res){
? ? ? ? console.log("成功")
? ? },function(res){
? ? ? ? console.log("失敗")
? ? })
要更加深入了解promise,就去官方文檔看看吧。