Promise,async/await昌简,yield/generater(一)

Promise是什么占业?如何使用?

我們起點(diǎn)低一點(diǎn)纯赎,先從Promise說起吧谦疾。。我們先看Promise的調(diào)用
eg1:

let aPromise = new Promise(function(resolve, reject) {
  console.log(233)
  setTimeout(function(){
    console.log(466)
    resolve("DONE"); 
  }, 250);
});

顯然犬金,Promise是個構(gòu)造函數(shù)(廢話)念恍,接受一個帶有resolve和reject兩個參數(shù)的函數(shù)作為參數(shù)。既然是構(gòu)造函數(shù)晚顷,肯定會想到原型(Prototype)方法和實例方法峰伙。Promise也確實有這些api,在介紹api之前该默,我覺得你應(yīng)該更關(guān)心Promise的使用瞳氓。
首先Promise接受的參數(shù)是立即執(zhí)行的。既在實例的化時栓袖,需要調(diào)用Promise的函數(shù)參數(shù)匣摘。如eg1,運(yùn)行該段代碼時裹刮,控制臺立即輸出233音榜,466隨后。是的必指,它就像是在你本來正常寫的異步操作外包了一層囊咏,并沒什么大的變化一樣,以往如果我們要有回調(diào)塔橡,則在466后編寫callback即可梅割。

Promise.then()

但是現(xiàn)在已經(jīng)不再如前了,請不要忽略 resolve("DONE");
此段代碼意味著成功回調(diào)時葛家,返回的值户辞。
我們在eg1后緊跟

aPromise.then(res=>{console.log(res)})

可以在控制臺看到466后緊跟著DONE,如果這是個獲取json的異步操作(并且我們調(diào)用resolve返回它)癞谒,此時我們拿到的可能就是json了底燎。
此時不免對.then產(chǎn)生了興趣刃榨,.then是實例方法之一,接受兩個函數(shù)作為參數(shù)双仍,第二個參數(shù)是可選的枢希。

aPromise.then(onFulfilled[, onRejected]);

@題外話Q:這種寫法如何理解...

aPromise.then(function(value) {
  // fulfillment
}, function(reason) {
  // rejection
});

onFulfilled:
該函數(shù)提供一個參數(shù),是fulfilled狀態(tài)時的返回值朱沃,當(dāng)Promise狀態(tài)為fulfilled時苞轿,該函數(shù)被調(diào)用。
onRejected :
該函數(shù)提供一個參數(shù)逗物,是Rejected狀態(tài)時的返回值搬卒,當(dāng)Promise狀態(tài)為Rejected時,該函數(shù)被調(diào)用翎卓。
這里不免提一下實例的另一個方法契邀,.catch()
該方法只處理rejected狀態(tài)的返回值,調(diào)用形式同then失暴,其實你可以理解catch為

aPromise.then(undefined, onRejected);

promise.catch(function(rej) {
    // 拒絕
    console.log(rej)
});

Promise的狀態(tài)坯门?

是的我們又成功引出了一個新的東西,Promise的狀態(tài)锐帜,這里說的是實例的狀態(tài)田盈,也就是new返回的對象的狀態(tài)。
一個promise有三種狀態(tài):
pending:意味對象剛剛被創(chuàng)建缴阎,初始狀態(tài)
fulfilled:操作成功
rejected:操作失敗
那promise是如何從pengding向其他兩個狀態(tài)發(fā)展的呢允瞧?
回到最初的構(gòu)造函數(shù)。

let aPromise = new Promise((resolve, reject) => {
    setTimeout(function(){
        console.log(466)
        reject("REJECT");
    }, 250);
});
aPromise.then((res)=>{console.log(res,'res')},rej =>{console.log(rej,"rej")})

此時控制臺輸出

466
REJECT rej

可以看出蛮拔,可以通過resolve/reject將promise的狀態(tài)更為fulfilled/rejected述暂。

let aPromise = new Promise((resolve, reject) => {
    setTimeout(function () {
        console.log(466);
        reject("REJECT");
    }, 250);
    setTimeout(function () {
        console.log(233);
        resolve("DONE");
    }, 600);
});
aPromise.then((res) => {
    console.log(res, 'res')
}, rej => {
    console.log(rej, "rej")
});
//輸出
466
REJECT rej
233

可以看到一個promise只改變一次狀態(tài)

值得注意的是,無論是調(diào)用.then還是調(diào)用.catch二者都繼續(xù)(立即)返回一個promise對象建炫。如果你連續(xù)使用多個.then畦韭,可以解釋為從.then()回調(diào)中返回一個值,則會以該值調(diào)用下一個.then()肛跌,若從.then()回調(diào)中返回類promise的內(nèi)容艺配,下一個.then則會等待promise的狀態(tài)變更settled(rejected/fulfilled)時調(diào)用。@Q:這塊其實并沒有完全懂...
這意味著我們可以這樣

getJson('a.json')
    .then(json => {
        return jsonOperate1(json)
    })
    .then(json2 => {
        return jsonOperate2(json2)
    })
    .then(json3 => {
        return jsonOperate3(json3)
    })

拋棄原來的一層層遞進(jìn)的回調(diào)了...
但是衍慎,這里還需要注意一下.then與.catch的區(qū)別转唉。

getJson('a.json')
   .then(json => {
       return jsonOperate1(json)
   })
   .catch(err => {
       return errOperate1(err)
   })
   .then(json2 => {
       return jsonOperate2(json2)
   })
   .then(json3 => {
       return jsonOperate3(json3)
   })
   .catch(err => {
       return errOperate(err)
   })
   .then(() => {
       console.log('END')
   })

你能畫出如上代碼的流程圖嗎?(如果不能稳捆,也許你需要看看參考內(nèi)容...

同步發(fā)送請求的結(jié)果順序問題

試想這樣一個場景赠法,你先request一個pic.json,json是個數(shù)組乔夯,每一項有每張圖片的地址砖织,圖片是有順序的款侵,圖片需要依次按序展示。你會如何處理邏輯侧纯?一次性發(fā)起全部請求新锈,所有完成后順序展示?按順序發(fā)起圖片請求茂蚓,依次展示壕鹉?自然是一次性發(fā)起多個請求剃幌,順序列表之一的請求完成時聋涨,便開始展示...那具體又如何操作呢?
請看下篇...

參考內(nèi)容:
JavaScript Promise:簡介 | Web | Google Developers(推薦閱讀)
Promise - JavaScript | MDN
Promises/A+
JavaScript Promise迷你書

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末负乡,一起剝皮案震驚了整個濱河市牍白,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抖棘,老刑警劉巖茂腥,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異切省,居然都是意外死亡最岗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門朝捆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來般渡,“玉大人,你說我怎么就攤上這事芙盘⊙庇茫” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵儒老,是天一觀的道長蝴乔。 經(jīng)常有香客問我,道長驮樊,這世上最難降的妖魔是什么薇正? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮囚衔,結(jié)果婚禮上挖腰,老公的妹妹穿的比我還像新娘。我一直安慰自己佳魔,他們只是感情好曙聂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鞠鲜,像睡著了一般宁脊。 火紅的嫁衣襯著肌膚如雪断国。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天榆苞,我揣著相機(jī)與錄音稳衬,去河邊找鬼。 笑死坐漏,一個胖子當(dāng)著我的面吹牛薄疚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赊琳,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼街夭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了躏筏?” 一聲冷哼從身側(cè)響起板丽,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趁尼,沒想到半個月后埃碱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酥泞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年砚殿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芝囤。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡似炎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凡人,到底是詐尸還是另有隱情名党,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布挠轴,位于F島的核電站传睹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岸晦。R本人自食惡果不足惜欧啤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望启上。 院中可真熱鬧邢隧,春花似錦、人聲如沸冈在。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纫谅,卻和暖如春炫贤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背付秕。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工兰珍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人询吴。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓掠河,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猛计。 傳聞我的和親對象是個殘疾皇子唠摹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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