javascript
JavaScript:学习笔记(9)——Promise对象
JavaScript:學(xué)習(xí)筆記(9)——Promise對象
引入Promise
Primose是異步編程的一種解決方案,比傳統(tǒng)的解決方案回調(diào)函數(shù)和事件更加合理和強大。如下面為基于回調(diào)函數(shù)的Ajax操作:
request.onreadystatechange = function () {if (request.readyState === 4) {if (request.status === 200) {return success(request.responseText);} else {return fail(request.status);}} }通過分析,我們發(fā)現(xiàn)回調(diào)一個很大的問題,就是層層嵌套的回調(diào)函數(shù),當(dāng)代碼量較大的時候,將難以維護(hù)。
所謂Promise,提供了另外一種鏈?zhǔn)降漠惒椒桨浮?/p> var ajax = ajaxGet('http://...'); ajax.ifSuccess(success).ifFail(fail);
先統(tǒng)一執(zhí)行AJAX邏輯,不關(guān)心如何處理結(jié)果,然后,根據(jù)結(jié)果是成功還是失敗,在將來的某個時候調(diào)用success函數(shù)或fail函數(shù)。古人云:“君子一諾千金”,這種“承諾將來會執(zhí)行”的對象在JavaScript中稱為Promise對象。
異步操作完成后,將可以設(shè)置Promise的狀態(tài),他有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)和rejected(已失敗),一旦設(shè)置好后任何操作都無法改變這個狀態(tài),并且任何時候都可以得到這個狀態(tài)。
?
基本用法
基本語法如下:
const promise = new Promise(function (resolve, reject) {//....some codeif(/*異步操作成功*/ )resolve(value)elsereject(error) });Promise構(gòu)造函數(shù)接收一個函數(shù)作為參數(shù),該函數(shù)的兩個參數(shù)分別是resolve、reject(由JS提供,不需要自己提供)
- resolve函數(shù)將Promise對象的狀態(tài)從“未完成”變?yōu)椤俺晒Α?#xff0c;在異步操作成功時調(diào)用,并將異步操作的結(jié)果,作為參數(shù)傳遞出去。
- reject函數(shù)將Promise對象的狀態(tài)從“未完成”變?yōu)椤笆 ?#xff0c;在異步操作失敗是調(diào)用,并將異步操作的錯誤,作為參數(shù)傳遞出去。
Promise實例生成以后,可以用then方法分別指定reolved狀態(tài)和rejected狀態(tài)的回調(diào)函數(shù)。
promise.then(function(value) {// success }, function(error) {// failure });then方法可以接受兩個回調(diào)函數(shù)作為參數(shù)。第一個回調(diào)函數(shù)是Promise對象的狀態(tài)變?yōu)閞esolved時調(diào)用,第二個回調(diào)函數(shù)是Promise對象的狀態(tài)變?yōu)閞ejected時調(diào)用。其中,第二個函數(shù)是可選的,不一定要提供。這兩個函數(shù)都接受Promise對象傳出的值作為參數(shù)。
實例
const promise = new Promise((resolve, reject) => {console.log("Promise")resolve(); });promise.then(()=>{console.log("Resolve") })console.log("Hi")上面代碼中,Promise新建后立即運行,所以首先輸出的是Promise。然后,then方法指定的回調(diào)函數(shù),將在當(dāng)前腳本所有同步任務(wù)執(zhí)行完才會執(zhí)行,所以resolved最后輸出。
一般來說,調(diào)用resolve或reject以后,Promise 的使命就完成了,后繼操作應(yīng)該放到then方法里面,而不應(yīng)該直接寫在resolve或reject的后面。所以,最好在它們前面加上return語句,這樣就不會有意外。
new Promise((resolve, reject) => {return resolve(1);// 后面的語句不會執(zhí)行console.log(2); })
?
轉(zhuǎn)載于:https://www.cnblogs.com/MrSaver/p/10520030.html
總結(jié)
以上是生活随笔為你收集整理的JavaScript:学习笔记(9)——Promise对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js cookie操作
- 下一篇: Spring Boot Quartz应用