Promise——介紹與基本使用

1阅嘶、Promise是什么

1.1 理解

  1. 抽象表達(dá)
    Promise是一門新的技術(shù)(ES6規(guī)范)
    Promise是JS種進(jìn)行異步編程的新解決方案
  2. 具體表達(dá)
    從語法上來說萝衩,promise是一個(gè)構(gòu)造函數(shù)嚼松;
    從功能上來說八毯,promise對(duì)象用來封裝一個(gè)異步操作并可以獲取其成功/失敗的結(jié)果值绢涡;

異步編程包括:fs文件操作乓梨,數(shù)據(jù)庫(kù)操作鳖轰,AJAX,定時(shí)器

// fs操作
require('fs').readFile('./index.html', (err, data) => {})
// Ajax
$.get('/server', (data) => {})
// 定時(shí)器
setTimeout(()=>{}, 2000)

2扶镀、為什么使用Promise

2.1 指定回調(diào)函數(shù)的方式更加靈活

  1. 原來的方式:必須在啟動(dòng)異步任務(wù)之前指定蕴侣;
  2. promise:?jiǎn)?dòng)異步任務(wù) => 返回promise對(duì)象 => 給promise對(duì)象綁定回調(diào)函數(shù)

2.2 支持鏈?zhǔn)秸{(diào)用,可以解決回調(diào)地獄問題

  1. 什么是回調(diào)地獄
    回調(diào)函數(shù)嵌套調(diào)用臭觉,外部回調(diào)函數(shù)異步執(zhí)行的結(jié)果是嵌套的回調(diào)執(zhí)行的條件昆雀;
  2. 回調(diào)地獄的缺點(diǎn)
    不便于閱讀和處理
  3. 解決方案
    promise鏈?zhǔn)秸{(diào)用

3、初次使用

// promise形式實(shí)現(xiàn)
// resolve 解決蝠筑,函數(shù)類型數(shù)據(jù)
// reject 拒絕忆肾,函數(shù)類型數(shù)據(jù)
const p = new Promise((resolve, reject) => {
  setTimeout(()=> {
    let n = rand(1, 100);
    // 判斷
    if(n<=30){
      resolve();    // 將promise對(duì)象的狀態(tài)設(shè)置為成功
    }else{
      reject(); // 將promise對(duì)象的狀態(tài)設(shè)置為失敗
    }
  }, 1000);
});
// 調(diào)用then方法對(duì)promise中的resolve和reject進(jìn)行定義
p.then(()=>{
  console.log("選中,恭喜");
}, ()=>{
  console.log("未選中菱肖,謝謝惠顧");
});

4客冈、實(shí)踐練習(xí)

4.1 fs模塊

要求讀取文件夾src下面的文件content.txt

// 1、采用回調(diào)函數(shù)的形式
const fs = require('fs');
fs.readFile('./src/content.txt', (err, data) => {
  // 如果出錯(cuò)稳强,則拋出錯(cuò)誤
  if(err) throw err;
  // 輸出文件內(nèi)容
  console.log(data.toString());
})

// 2场仲、采用Promise的形式
let p = new Promise((resolve, reject) => {
   fs.readFile('./src/content.txt', (err, data) => {
     // 如果出錯(cuò)
     if(err) reject(err);
      // 如果成功
      resolve(data);
  });
});
//調(diào)用then
p.then(value => {
  console.log(value.toString());
}, reason => {
  console.log(reason);
})

4.2 ajax模塊

點(diǎn)擊按鈕發(fā)送ajax請(qǐng)求

/*1和悦、原來的方式*/
const btn = document.querySelector("#btn");
btn.addEventListener('click', function(){
  // 1.創(chuàng)建對(duì)象
  const xhr = new XMLHttpRequest();
  // 2.初始化
  xhr.open('GET', 'https://api.apiopen.top/getJoke');
  // 3.發(fā)送
  xhr.send();
  // 4. 處理響應(yīng)結(jié)果
  xhr.onreadystatechange = function() {
    if(xhr.readyState === 4) {
      // 判斷響應(yīng)狀態(tài)碼 2xx
      if(xhr.status >= 200 && xhr.status < 300) {
        // 輸出響應(yīng)體
        console.log(xhr.response);
      } else {  
        // 輸出響應(yīng)狀態(tài)碼
        console.log(xhr.status);
      }
    }
  }
})

/*使用promise*/
const btn = document.querySelector('#btn');
btn.addEventListener('click', function(){
  const p = new Promise((resolve, reject) => {
    // 1、創(chuàng)建對(duì)象 
    const xhr = new XMLHttpRequest();
    // 2渠缕、初始化
    xhr.open('GET', 'https://api.apiopen.top/getJok');
    // 3鸽素、發(fā)送
    xhr.send();
    // 4、處理響應(yīng)結(jié)果
    xhr.onreadystatechange = function(){
      // 判斷狀態(tài)
      if(xhr.readyState === 4){
          if(xhr.status >= 200 && xhr.status < 300){
            resolve(xhr.response);
          }else{
            reject(xhr.status);
          }
        }
    }
  })
});

p.then(value=>{
  console.log(value);
}, reason=>{
  console.warn();
})

5. promise的狀態(tài)

狀態(tài)指的是實(shí)例對(duì)象中的一個(gè)屬性 【PromiseState】:

  • pending -> resolved 成功
  • pending -> rejected 失敗

只有這兩種亦鳞,且一個(gè)promise對(duì)象只能改變一次馍忽,無論是成功還是失敗,都有一個(gè)結(jié)果數(shù)據(jù)燕差;
成功的結(jié)果一般稱為value遭笋,失敗的結(jié)果一般是reason;

6. promise 對(duì)象的值

實(shí)例對(duì)象中的另一個(gè)屬性【PromiseResult】
保存異步任務(wù)【成功/失敗】的結(jié)果

  • resolve
  • reject

7. promise的基本流程

基本流程

8. promise的相關(guān)API使用

8.1 promise構(gòu)造函數(shù)

Promise(excutor){}

  • executor函數(shù):執(zhí)行器 (resolve, reject) => {}
  • resolve 函數(shù):內(nèi)部定義成功時(shí)候我們調(diào)用的函數(shù) value => {}
  • reject 函數(shù):內(nèi)部定義失敗時(shí)候我們調(diào)用的函數(shù) reason => {}

8.2 Promise.prototype.then 方法

(onResolved, onRejected) => {}

  • onResolved函數(shù):成功的回調(diào)函數(shù) (value) => {}
  • onRejected函數(shù):失敗的回調(diào)函數(shù) (reason) => {}
    指定用于得到成功value的成功回調(diào)和用于得到失敗reason的失敗回調(diào)徒探,返回一個(gè)新的Promise對(duì)象

8.3 Promise.prototype.catch 方法

(onRejected) => {}

  • onRejected 函數(shù):失敗的回調(diào)函數(shù) (reason) => {}

8.4 Promise.resolve方法

(value) => {}

  • value:成功的數(shù)據(jù)或者promise對(duì)象
let p1 = Promise.resolve(521);
console.log(p1);

8.5 Promise.reject方法

(reason)=>{}

  • reason: 失敗的原因

8.6 Promise.all方法

(promises) => {}

  • 返回一個(gè)新的promise瓦呼,只有所有的promise都成功才能成功,只要有一個(gè)失敗就直接失敳獍怠央串;

8.7 Promise.race方法

(promises) => {}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碗啄,隨后出現(xiàn)的幾起案子质和,更是在濱河造成了極大的恐慌,老刑警劉巖稚字,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饲宿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡尉共,警方通過查閱死者的電腦和手機(jī)褒傅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門弃锐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袄友,“玉大人,你說我怎么就攤上這事霹菊【珧迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵旋廷,是天一觀的道長(zhǎng)鸠按。 經(jīng)常有香客問我,道長(zhǎng)饶碘,這世上最難降的妖魔是什么目尖? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮扎运,結(jié)果婚禮上瑟曲,老公的妹妹穿的比我還像新娘饮戳。我一直安慰自己,他們只是感情好洞拨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布扯罐。 她就那樣靜靜地躺著,像睡著了一般烦衣。 火紅的嫁衣襯著肌膚如雪歹河。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天花吟,我揣著相機(jī)與錄音秸歧,去河邊找鬼。 笑死示辈,一個(gè)胖子當(dāng)著我的面吹牛寥茫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矾麻,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼纱耻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了险耀?” 一聲冷哼從身側(cè)響起弄喘,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甩牺,沒想到半個(gè)月后蘑志,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贬派,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年急但,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搞乏。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡波桩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出请敦,到底是詐尸還是另有隱情镐躲,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布侍筛,位于F島的核電站萤皂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匣椰。R本人自食惡果不足惜裆熙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧入录,春花似錦齐媒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贫奠,卻和暖如春唬血,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唤崭。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工拷恨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谢肾。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓腕侄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親芦疏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冕杠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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