js異步解決方案:
回調函數、事件監聽、發布訂閱、promise、generator、async/await
回調函數引起的問題是回調地獄、使代碼可讀性和可維護性被破壞
async/await是generator方案的語法糖
async/await和generator方案,相較於Promise而言,有一個重要的優勢:Promise的錯誤需要通過回調函數捕獲,try catch是行不通的,而async/await和generator允許try/catch
promise的理解(關鍵字: 代理對象、三個狀態、狀態切換機制)
promise對象是一個代理對象,它接受一個執行器作為入參,允許把異步任務的成功和失敗分別綁定到對應的出爐方法上去
一個promise實例有3中狀態:
pending狀態,表示進行中,是promise實例創建后的一個初始狀態
fulfilled狀態,表示成功完成,這是執行器調用resolve后,達成的狀態
rejected狀態,表示操作失敗,是執行期調用reject后,達成的狀態
promise實例的狀態是可以改變的,但是只允許被改變一次,當從pending切換為rejected后,就無法再切換到fulfilled,
當promise的狀態為fulfilled的時候,就會觸發then方法里面的onfulfilled函數,當狀態為rejected的時候,就會觸發onrejected函數
promise的出現,主要是為了解決異步里面產生的地獄回調
promise的常見方法:
主要有4種:all、race、reject和resolve
Promise.all(iterable): 返回一個新的promise,參數里所有的promise對象都成功時,才觸發成功,任何一個promise對象失敗立即觸發該對象的失敗
var p1 = Promise.resolve('1號選手');
var p2 = '2號選手';
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "3號選手");
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // ["1號選手", "2號選手", "3號選手"]
});
Promise.race(iterable): 當參數里任何一個子primise成功或失敗后,父promise馬上用子promise的成功返回值或失敗詳情作為參數,調用父promise綁定的相應的處理函數,並返回該promise對象
var p1 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, "1號選手");
});
var p2 = new Promise(function(resolve, reject) {
setTimeout(resolve, 50, "2號選手");
});
// 這里因為 2 號選手返回得更早,所以返回值以 2號選手為准
Promise.race([p1, p2]).then(function(value) {
console.log(value); // "2號選手"
});
promise的then方法參數只能是函數,如果不是函數,會出現值穿透問題,值會穿透到可執行的那個函數那
Promise.resolve(1)
.then(Promise.resolve(2))
.then(3)
.then()
.then(console.log)
// 運行結果:1