promise學習總結

2022-05-03 03:39:06 字數 3728 閱讀 2631

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...