promise是非同步程式設計的一種解決方案,它有三種狀態,分別是pending-進行中、resolved-已完成、rejected-已失敗
當promise的狀態又pending轉變為resolved或rejected時,會執行相應的方法,並且狀態一旦改變,就無法再次改變狀態,這也是它名字promise-承諾的由來
直接上案例了,在案例中理解:
最簡單的promise
new promise(resolve =>,2000);}).then(value=>)
分兩次,順序執行
console.log('start');new promise(resolve =>, 2000);
}) .then(value =>, 2000)
});})
.then(value =>);
//結果//
start
//hello (2s)
//worldworld (4s)
假如乙個promise已經完成,再.then()會怎樣
console.log('start');let promise = new promise(resolve=>,2000);
});settimeout(()=>)
},4000)
//結果
//start
//this promise fullfilled (2s)
//hello,world (4s)
//在任何地方生成乙個promise後,可以存為乙個變數,不管該promise有完成,都會依次根據佇列執行
假如在 .then() 的函式裡面不返回新的 promise, 會怎樣?
console.log('start');new promise(resolve =>, 2000);
}) .then(value =>, 2000);
})}());
return
false
; })
.then(value =>)
//結果//
start
//hello (2s)
//falseworld (2s)
//第二個promise (4s)
//.then() 的函式裡面不返回新的 promise,會預設執行下乙個環節,即使你直接返回了false,也會執行
//備註
//匿名函式,(function(){})();立即執行,主要利用函式內的變數作用域,避免產生全域性變數,影響整體頁面環境,增加**的相容性。
.then()接受兩個函式作為引數,分別代表fulfilled和rejected
.then()返回乙個新的promise例項,所以它可以鏈式呼叫
狀態相應函式可以返回新的promise或其他值,如果返回新的promise,那麼下一級.then()會在新的promise狀態改變後執行
!!如果返回其他任何值,則會立即執行下一級.then()
.then()裡面有.then()的情況
會等裡面的.then()執行完,再執行外面的。最好不要這樣寫,依次展開效果一樣
new promise(resolve =>, 1000)}) .then(value =>, 1000)
}).then(value =>)
.then(value =>)
}).then(value =>)
/*結果:
start
11-1
1-21-3
2*/
錯誤處理兩種做法:
promise會自動捕獲內部異常,並交給rejected響應函式處理
1.reject('錯誤資訊').then(null,message=>{})
2.throw new error('錯誤資訊').catch(message=>{})
推薦時候用第二種,更加清晰,並且可以捕獲前面的錯誤
console.log('go');new promise((resolve,reject)=>,1000)
}) .then(value=>)
.catch(error=>)
//go//
error: bye
.catch() + .then()連用
.catch()也會返回乙個promise例項
建議在所有佇列後面都加上.catch()
console.log('go');new promise(resolve=>, 1000);
}) .then(()=>)
.catch((err)=>)
.then(()=>)
.then(()=>)
.catch((err)=>)
/*結果一:
gostart
i catch:error: test error
arrive here
and here
結果二:
gostart
i catch:error: test error
i catch:error: another error
*/
promise.all([p1,p2,p3,...]); 批量同時執行多個promise例項,包裝成乙個新的promise例項,返回的是所有promise結果組成的陣列
console.log('go');promise.all([1,2,3])
.then(all=>,'xxoo',false
])})
.then(all =>, 1000);
});let p2 = new promise(resolve=>, 3000);
});return
promise.all([p1,p2]);
}).then(all =>, 1000);
});let p2 = new promise((resolve,reject)=>, 1000);
});let p3 = new promise((resolve,reject)=>, 1500);
});return
promise.all([p1,p2,p3]);
}).then(all=>)
.catch(err=>)
/*結果:
go 1: [ 1, 2, 3 ]
2: [ [function], 'xxoo', false ]
3: [ 'i`m p1', 'i`m p2' ]
catch i`m p2
*/
promise方法總結
優點 1 物件的狀態不受外界的影響,只有非同步操作的結果可以決定是那種狀態 2 狀態一旦改變,就不會再次改變。任何時候都可以得到這個結果。在這裡跟 event 事件不同,如果錯過了這個事件結果再去監聽,是監聽不到event事件的。缺點 1 promise一旦執行無法取消。2 如果不設定 函式prom...
Promise學習筆記
promise 表示乙個非同步操作的最終結果,與之進行互動的方式主要是then方法,該方法註冊了兩個 函式,用於接收 promise 的終值或本 promise 不能執行的原因。乙個 promise 的當前狀態必須為以下三種狀態中的一種 等待態 pending 執行態 fulfilled 和拒絕態 ...
promise執行順序總結
1 const promise new promise resolve,reject promise.then console.log 5 執行結果是 1,2,5,4 解釋 promise的建構函式是同步執行,promise.then中的函式是非同步執行。2 const promise new pr...