這篇文章主要介紹“javascript Promise是什么”,在日常操作中,相信很多人在javascript Promise是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”javascript Promise是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
公司主營業(yè)務:成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出碌曲免費做網(wǎng)站回饋大家。
什么是Promise
Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強大。它由社區(qū)最早提出和實現(xiàn),ES6將其寫進了語言標準,統(tǒng)一了用法,原生提供了Promise對象。
所謂Promise,簡單說就是一個容器,里面保存著某個未來才會結(jié)束的事件(通常是一個異步操作)的結(jié)果。從語法上說,Promise是一個對象,從它可以獲取異步操作的消息。Promise提供統(tǒng)一的API,各種異步操作都可以用同樣的方法進行處理。
上面是Promise的一個定義,引自阮一峰的ES6標準入門一書。S6標準入門。多說一句,目前的JavaScript項目無論是前臺或者是后臺,都應該采用ES6的標準語法來寫,ES6讓JavaScript的書寫更加的清晰和規(guī)范。
基本用法
如何來構(gòu)造一個promise對象呢?ES6中提供了原生Promise可以使用。
var promise = new Promise(function(resolve, reject) { // ... here is some code if (/* 異步操作成功 */){ resolve(value); } else { reject(error); } });
上面的例子給出了new一個promise對象的方法,Promise的構(gòu)造函數(shù)接受一個函數(shù)作為參數(shù)傳入,這個函數(shù)的兩個參數(shù),reject和resolve是JavaScript本身提供的兩個函數(shù)。一個promise對象有三個狀態(tài)分別是,pending,resolved,rejected。resolve函數(shù)可以將pending狀態(tài)轉(zhuǎn)變?yōu)閞esolved狀態(tài)。reject函數(shù)可以講pending狀態(tài)轉(zhuǎn)變了rejected狀態(tài)。對象的狀態(tài)不受外界的影響,同樣也是promise名字的由來。外部你拿著我的一個承諾,一會我會告訴你我的狀態(tài)。
promise對象通過then方法來添加回調(diào)函數(shù)。例如這樣
promise.then(data=> console.log(data), err=> console.log(err));
當promise被resolved的時候,就會把data log出來。當promise被rejected的時候,err就會被log出來??瓷先ズ孟袷峭唵蔚?,的確Promise的應用使得異步的操作,以同步的形式表現(xiàn)出來。當發(fā)生錯誤的時候可以通過catch方法,來定義回調(diào)函數(shù)。
怎么用
上邊都是一些干巴巴的定義,那么到底該怎么用呢?Promise又怎么樣的解決了問題呢,下邊我們看一個例子。假設(shè)下邊一個場景,我們一個服務,從一個外邊service獲取數(shù)據(jù),然后寫到一個db里,或者一個存儲里,***在把存儲的狀態(tài)龍出來,那么如果沒有promise是怎么寫的呢?可能會是這樣。
getData(function (value1) { storeToDb(value1, function(value2) { logStore(value2, function(value3) { //... }); }); });
傳統(tǒng)的回調(diào)的寫法,這樣使得代碼邏輯混亂在一起。再想想如果再加上錯誤處理的情況,更是酸爽。那么用promise來寫會怎么樣呢?看下邊這樣的代碼
function getData(){ return new Promise((resolve,reject) =>{ // ... send request to get data if(/* get successfully*/){ resolve(data) }else{ reject(err) } }) } function storeData(data){ return new Promise((resolve,reject)=>{ // ... store the data if(/*store successfully*/){ resolve(data) }else{ reject(err) } }) } getData() .then(data => storeData(data)) .then(data => console.log('the process is done',data)); .catch(err => console.error('there is the err',err));
這樣寫是不是就是很清楚了,先getData,然后再storeData,***將這次運行的情況log了出來,其中有任何的問題,在catch中都可以Catch出來。代碼的邏輯以同步的方式得到了體現(xiàn)。我們來看看如果是其他語言會怎么寫,下邊是個ruby的語言的例子
def get_data // ...send request if /*get successfully */ return data else raise GetDataError end end def store_data // ...save to db if /*save successfully */ return data else raise StoreDataError end end /*Main Logic*/ begin request_data = get_data db_data = store_data request_data p "here is the store data #{db_data}" rescue e p "here is some errors #{e}" end
我們對比兩個例子,可以看到在使用的Promise后讓JavaScript的異步方式的編程模式更將清楚,也更加讓人容易理解。
由于JavaScript的執(zhí)行環(huán)境是單線程的,所以大量采用了異步的方式來進行編程,這使得我們寫起代碼并不十分符合我們一般的習慣。但是Promise的出現(xiàn)讓這種問題能得到一定程度的緩解。
但是異步操作異步操作的好處,比如上邊的那個例子,如果我們想要做的同時并發(fā)10個操作,那個在ruby或者其他語言中中就要啟多個線程來進行。但是JavaScript就完全沒有這個問題。只要簡單的loop下就行了。
但是如果我們想要在這10個操作完成后根據(jù)返回的狀態(tài)做點其他操作該怎么做呢?這時候用Promise.all就是***的了。
let p = Promise.all([p1, p2, p3]);
Promise.all接受數(shù)組作為參數(shù)傳入,每個元素都是一個promise對象。只要所有子promise都resolved以后,p才會被resolved。只要有一個被rejected,這個p就會被rejected。但是有一點是這些子promise之間并不會有順序的關(guān)系。再來看一個例子:
var guid = 0; function run() { guid++; var id = guid; return new Promise(resolve => { setTimeout(function () { console.log(id); resolve(id); }, (Math.random() * 1.5 | 0) * 1000); }); } var promises = Array.from({ length: 10 }, run); Promise.all(promises)
OUTPUT:
2 3 5 6 7 8 10 1 4 9
到此,關(guān)于“javascript Promise是什么”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網(wǎng)頁名稱:javascriptPromise是什么
文章位置:http://muchs.cn/article42/pjjihc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站設(shè)計、軟件開發(fā)、虛擬主機、App開發(fā)、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)