promise是什么/怎么用

概念:

promise是異步編程的一種解決方案.

? ? ? ? (就可以將異步操作以同步操作的流程表達(dá)出來(lái),避免了層層嵌套的回調(diào)函數(shù))

異步:之前實(shí)現(xiàn)異步操作的方式.①回調(diào)函數(shù)②事件觸發(fā)

作用:解決異步操作問(wèn)題.

特點(diǎn):

(1)對(duì)象的狀態(tài)不受外界影響.promise對(duì)象代表一個(gè)異步操作,

? ? ? ? ? ? 有三種狀態(tài): pending(進(jìn)行中).fulfilled(已成功),rejected(已失敗)

? ? ? ? ? ? 只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無(wú)法改變這個(gè)狀態(tài).

? ? ? ? (2)對(duì)象的狀態(tài),一旦改變,就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果.

? ? ? ? ? ? ?(promise對(duì)象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled和從pendig變?yōu)閞ejected.)

基本用法:

(1)通過(guò)new promise對(duì)象可以創(chuàng)建promise實(shí)例

? const promise = new Promise(function (resolve,reject){? })

(2)參數(shù)說(shuō)明:promise對(duì)象接收一個(gè)函數(shù)做參數(shù),并且這個(gè)函數(shù)的參數(shù)分別是resolve和reject,它們是兩個(gè)函數(shù),由javascript引擎提供

(3)resolve函數(shù)的作用.在異步操作成功時(shí)調(diào)用,并將異步操作的結(jié)果,作為參數(shù)傳遞出去

(4)reject函數(shù)的作用.在異步操作失敗時(shí)調(diào)用,并將異步操作報(bào)出的錯(cuò)誤,作為參數(shù)傳遞出去

說(shuō)明:

promise實(shí)例生成以后,可以用then方法,分別指定成功和失敗的回調(diào)函數(shù)

分別利用回調(diào)函數(shù)和promise模擬1秒通信(在執(zhí)行完打印'hello',1s再打印'world')

①回調(diào)函數(shù)發(fā)法:? ?function ajax (callback){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?console.log('hello')

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setTimeout(function(){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?callback&&callback()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? },1000)

? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ajax(function(){

? ? ? ? ? ? ? ? ? ? ? ? ? ?console.log('world')

? ? ? ? ? ? ? ? ? ? ?}

②promise方法? ? ? ?function? ?ajax(){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?console.log('hello')

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return new Promise(function(resolve,reject){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?setTimeout(function(){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? resolve()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? },1000)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ajax().then(function(){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?console.log('world')

? ? ? ? ? ? ? ? ? ? ? ? ? })

.then()是promise實(shí)例的一個(gè)方法,表示要執(zhí)行的下一步操作

promise實(shí)例的方法

(1)then(參數(shù)1,參數(shù)2)

作用:為promise實(shí)例添加狀態(tài)改變時(shí)的回調(diào)函數(shù)

? ? ? ? 參數(shù)1是成功的回調(diào)函數(shù),參數(shù)2是失敗的回調(diào)函數(shù)

? ? ? ? 返回值:then方法返回的是一個(gè)新的promise實(shí)例,.then方法可以采用鏈?zhǔn)讲僮?/p>

(2)catch()

作用:

指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù),作用等同于then方法的第二個(gè)參數(shù)

let ajax =? function(num){

return new Promise(resolve,reject)=>{

? ? ? ?if(num>5){

? ? ? ? ? ?resolve(num)

? ? ? ?}else{

? ? ? ? ? ? ?throw new Error('出錯(cuò)了')

? ? ? ?}

? })

}

ajax(2).then(function(num){

console.log(num)

}).catch(function(err){

console.log(err)

}

Promise風(fēng)格的ajax

? ? ? ? ? ? ? ? ? ? function promiseAjax(json){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let url = json.url

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let type = json.type || 'get'

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let parmas = json.data || {}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let str = ''

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? for(let k in parmas){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? str += k+'='+parmas[k]+'&'

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return new Promise((resolve.reject)=>{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? let xhr = new XMLHttpRequest()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (type.toLowerCase()==='get'){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? xhr.open('get',`${url}?${str}time=${Data.now()}`,true)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? xhr.send()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}else if(type.toLowerCase()==='post'{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? xhr.open('post',url,true)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? xhr.setRequestHeader('content-type','application/x-www-form-urlencoded')

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? xhr.send(str.substring(0,str.lastIndexOf('&')))??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? xhr.onreadystatechange = function (){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(this.readyState===4){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(this.status>=200 && this.status<300){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? resolve(JSON.parse(this.reponseText)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}else{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?let error = new Error()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?error.status = this.status

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? reject(error)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ?})

? ? ? ? ? ? ? ? ? ?}

Promise的類(lèi)(高級(jí))方法

(1)promise.all()

將多個(gè)promise實(shí)例,包裝成一個(gè)新的promise實(shí)例,簡(jiǎn)單的來(lái)說(shuō)就是多個(gè)異步操作都成功則才執(zhí)行成功的回調(diào),否則執(zhí)行失敗的回調(diào)

參數(shù)說(shuō)明: 接收一個(gè)數(shù)組為參數(shù),數(shù)組的每一項(xiàng)都是promise實(shí)例

(2)promise.race()

競(jìng)賽,將多個(gè)promise實(shí)例,包裝成一個(gè)新的promise實(shí)例,只要有一個(gè)實(shí)例率先改變狀態(tài),promise的狀態(tài)就跟著改變

參數(shù)說(shuō)明: 接收一個(gè)數(shù)組作為參數(shù),數(shù)組的每一項(xiàng)都是promise實(shí)例

例如:請(qǐng)求三張網(wǎng)絡(luò)圖片有一張加載完,所有圖片完全加載完添加到頁(yè)面上

封裝加載圖片的方法

? ? ? ? ? ? function loadImg(src){

? ? ? ? ? ? ? ?return new Promise((resolve,reject)=>{

? ? ? ? ? ? ? ? ?var img = document.createElement('img')

? ? ? ? ? ? ? ? ?img.src = src

? ? ? ? ? ? ? ? ?img.onload = function(){

? ? ? ? ? ? ? ? ? resolve( img )

? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? img.error = function(){

? ? ? ? ? ? ? ? ? ?reject()

? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ?}

? ? ? }


? ? ? ? ? ? ? ? ? ? ?Promise.all([

? ? ? ? ? ? ? ? ? ? ? loadImg

? ? ? ? ? ? ? ? ? ? ? ('圖片路徑'),

? ? ? ? ? ? ? ? ? ? ?loading

? ? ? ? ? ? ? ? ? ? ? ?('圖片路徑')

? ? ? ? ? ? ? ? ? ?]).then(function(imgs){

? ? ? ? ? ? ? ? ? ? imgs.forEach((img)=>{

? ? ? ? ? ? ? ? ? ? document.body.appendChild(img)

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? Promise.race([

? ? ? ? ? ? ? ? ? ?loadImg

? ? ? ? ? ? ? ? ? ? ('圖片路徑')

? ? ? ? ? ? ? ? ? ?loadImg

? ? ? ? ? ? ? ? ? ?('圖片路徑')

? ? ? ? ? ?]).then(function(img){

? ? ? ? ? ? ? ? ?document.body.appendChild(img)

? ? ? ? ?}

promise缺點(diǎn)

①一旦新建就會(huì)立即執(zhí)行,無(wú)法中途取消

②如果不設(shè)置回調(diào)函數(shù),promise內(nèi)容拋出的錯(cuò)誤,不會(huì)反應(yīng)到外部

③當(dāng)處于pending狀態(tài)時(shí),無(wú)法得知目前進(jìn)展到哪一個(gè)階段

promise的鏈?zhǔn)讲僮鞔a繁多,有一個(gè)方法可以解決既簡(jiǎn)單又方便

Async:異步主要是將異步的代碼變成同步的寫(xiě)法

await等待? await? ?promise對(duì)象

await異步參數(shù)

async? function fn(){

let ret = await promiseAjax({url:'data/arr.txt'})

console.log(ret)

ret = await promiseAjax({url:'data/list/txt'})

console.log(ret)

}

fn()

需要引入jquery.js


?async function fn(){

? ? ? ? ? ? try{

? ? ? ? ? ? ? ? let ret=await new Promise((resolve,reject)=>{

? ? ? ? ? ? ? ? //....

? ? ? ? ? ? ? ? if(成功了){

? ? ? ? ? ? ? ? ? ? resolve(成功的數(shù)據(jù))

? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? reject(錯(cuò)誤的信息)

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? })

? ? ? ? ? ? }.catch(e){

? ? ? ? ? ? ? ? console.log(e);

? ? ? ? ? ? }finally{

? ? ? ? ? ? ? ? //不管有沒(méi)有錯(cuò)誤這里的代碼都會(huì)執(zhí)行

? ? ? ? ? ? }

? ? ? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惫撰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子放仗,更是在濱河造成了極大的恐慌润绎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異莉撇,居然都是意外死亡呢蛤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)棍郎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)其障,“玉大人,你說(shuō)我怎么就攤上這事涂佃±恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵辜荠,是天一觀的道長(zhǎng)汽抚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)伯病,這世上最難降的妖魔是什么造烁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮午笛,結(jié)果婚禮上惭蟋,老公的妹妹穿的比我還像新娘。我一直安慰自己药磺,他們只是感情好告组,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著癌佩,像睡著了一般木缝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驼卖,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天氨肌,我揣著相機(jī)與錄音,去河邊找鬼酌畜。 笑死怎囚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桥胞。 我是一名探鬼主播恳守,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贩虾!你這毒婦竟也來(lái)了催烘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缎罢,失蹤者是張志新(化名)和其女友劉穎伊群,沒(méi)想到半個(gè)月后考杉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舰始,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年崇棠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丸卷。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枕稀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谜嫉,到底是詐尸還是另有隱情萎坷,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布沐兰,位于F島的核電站哆档,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏僧鲁。R本人自食惡果不足惜虐呻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寞秃。 院中可真熱鬧,春花似錦偶惠、人聲如沸春寿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绑改。三九已至,卻和暖如春兄一,著一層夾襖步出監(jiān)牢的瞬間厘线,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工出革, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留造壮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓骂束,卻偏偏與公主長(zhǎng)得像耳璧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子展箱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 本文旨在簡(jiǎn)單講解一下javascript中的Promise對(duì)象的概念旨枯,特性與簡(jiǎn)單的使用方法。并在文末會(huì)附上一...
    _暮雨清秋_閱讀 2,197評(píng)論 0 3
  • # Ajax標(biāo)簽(空格分隔): 筆記整理---[TOC]### 從輸入網(wǎng)址開(kāi)始:- 在學(xué)習(xí)ajax之前混驰,你應(yīng)該先了...
    V8閱讀 259評(píng)論 1 0
  • 你不知道JS:異步 第三章:Promises 在第二章攀隔,我們指出了采用回調(diào)來(lái)表達(dá)異步和管理并發(fā)時(shí)的兩種主要不足:缺...
    purple_force閱讀 2,067評(píng)論 0 4
  • Promise學(xué)習(xí)(上): 資料: JavaScript Promise迷你書(shū) 原著:azu / 翻譯:liubi...
    你隔壁的陌生人閱讀 563評(píng)論 0 1
  • 一皂贩、Promise是什么? Promise是最早由社區(qū)提出和實(shí)現(xiàn)的一種解決異步編程的方案昆汹,比其他傳統(tǒng)的解決方案(回...
    Macchiato_go閱讀 1,452評(píng)論 0 0