Promise,async,await筆記

Promise,async,await筆記

Promise

創(chuàng)建promise對(duì)象

  • Promise對(duì)象構(gòu)造方法傳入一個(gè)帶有resolve和reject兩個(gè)參數(shù)的函數(shù)function
var promise = new Promise(function (resolve, reject) {
    //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
    setTimeout(function () {
        console.log('異步操作');
    }, 2000)
});

promise中resolve僵闯,reject

  • Promise對(duì)象構(gòu)造方法傳入的function中的resolve尽狠,reject參數(shù)是用來處理成功或失敗
  • Promise對(duì)象總共有3中狀態(tài):
    • pending: 初始狀態(tài)钧舌,不是成功或失敗狀態(tài)述雾。
    • fulfilled: 意味著操作成功完成疯淫。(執(zhí)行resolve狀態(tài)會(huì)變?yōu)閒ulfilled)
    • rejected: 意味著操作失敗。(執(zhí)行reject狀態(tài)會(huì)變?yōu)閞ejected)
var promise = new Promise(function (resolve, reject) {
    //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
    setTimeout(function () {
        let success = true;
        if (success) {
            console.log('成功');
            resolve('成功');//fulfilled
        } else {
            console.log('失敗');
            reject('失敗');//rejected
        }
    }, 2000)
});

promise中then者疤,catch

  • Promise實(shí)例通過then接受成功(可以連點(diǎn))互订,catch接收失敗
  • promise一次resolve執(zhí)行會(huì)順序觸發(fā)promise實(shí)例下的所有then方法
  • promise中reject,throw Erroe都會(huì)promise實(shí)例下的所有catch方法
var promise = new Promise(function (resolve, reject) {
    //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
    setTimeout(function () {
        let success = true;
        if (success) {
            resolve('執(zhí)行成功');
        } else {
            reject('失敗');
        }
    }, 2000)
});
//promise實(shí)例接受成功和失敗
promise.then(function (data) {
    console.log(1);
    console.log(data);
}).then(function (data) {
    console.log(2);
    console.log(data);
}).catch(function (err) {
    console.log(err);
});
// 上述代碼會(huì)打印:
// 1
// 執(zhí)行成功
// 2
// 執(zhí)行成功

兩個(gè)promise依賴執(zhí)行

  • promise的then方法默認(rèn)返回的是自身promise實(shí)例(從而實(shí)現(xiàn)then的連點(diǎn)),當(dāng)在then方法中添加return時(shí),return就會(huì)根據(jù)return來變化

現(xiàn)有一個(gè)這樣的業(yè)務(wù)場景需要先調(diào)接口A獲取用戶信息,再根據(jù)接口A返回的數(shù)據(jù)調(diào)用接口B,兩個(gè)接口存在依賴

var promise1 = new Promise(function (resolve, reject) {
    //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
    setTimeout(function () {
        let success = true;
        if (success) {
            resolve('接口A');
        } else {
            reject('失敗');
        }
    }, 2000)
});
//promise實(shí)例接受成功和失敗
promise1.then(function (data) {
    console.log('接口A執(zhí)行');
    console.log(data);
    var promise2 = new Promise(function (resolve, reject) {
        //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
        setTimeout(function () {
            let success = true;
            if (success) {
                resolve('接口B');
            } else {
                reject('失敗');
            }
        }, 1500)
    });
    return promise2;
}).then(function (data) {
    console.log('接口B執(zhí)行');
    console.log(data);
}).catch(function (err) {
    console.log(err);
});
// 上述代碼會(huì)打印:
// 接口A執(zhí)行
// 接口A
// 接口B執(zhí)行
// 接口B

兩個(gè)promise順序執(zhí)行

  • promise的then方法默認(rèn)返回的是自身promise實(shí)例(從而實(shí)現(xiàn)then的連點(diǎn)),當(dāng)在then方法中添加return時(shí),return就會(huì)根據(jù)return來變化

現(xiàn)有一個(gè)這樣的業(yè)務(wù)場景需要先調(diào)接口A和接口B獲取數(shù)據(jù),根據(jù)結(jié)果A返回?cái)?shù)據(jù)取處理結(jié)果B返回的數(shù)據(jù),兩個(gè)接口不存在依賴,但是存在順序

  • 以下demo雖然接口B會(huì)比接口A早返回?cái)?shù)據(jù)但是promise可以實(shí)現(xiàn)異步順序處理
var promise1 = new Promise(function (resolve, reject) {
    //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
    setTimeout(function () {
        let success = true;
        if (success) {
            resolve('接口A執(zhí)行成功');
        } else {
            reject('失敗');
        }
    }, 2000)
});
var promise2 = new Promise(function (resolve, reject) {
    //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
    setTimeout(function () {
        let success = true;
        if (success) {
            resolve('接口B執(zhí)行成功');
        } else {
            reject('失敗');
        }
    }, 1500)
});
//promise實(shí)例接受成功和失敗
promise1.then(function (data) {
    console.log(1);
    console.log(data);
    return promise2;
}).then(function (data) {
    console.log(2);
    console.log(data);
}).catch(function (err) {
    console.log(err);
});
// 上述代碼會(huì)打印:
// 1
// 接口A執(zhí)行成功
// 2
// 接口B執(zhí)行成功

Promise.all方法

  • all方法是Promise類下的靜態(tài)方法,用于處理多個(gè)promise執(zhí)行合并

現(xiàn)有一個(gè)這樣的業(yè)務(wù)場景渲染需要接口A和接口B數(shù)據(jù),兩個(gè)接口不存在依賴卷拘,也不存在順序

var promise1 = new Promise(function (resolve, reject) {
    //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
    setTimeout(function () {
        let success = true;
        if (success) {
            resolve('promise1執(zhí)行成功');
        } else {
            reject('失敗');
        }
    }, 1500)
});
var promise2 = new Promise(function (resolve, reject) {
    //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
    setTimeout(function () {
        let success = true;
        if (success) {
            resolve('promise2執(zhí)行成功');
        } else {
            reject('失敗');
        }
    }, 2000)
});
Promise.all([promise1,promise2]).then(function (datas) {
    console.log(datas[0]);
    console.log(datas[1]);
}).catch(function (err) {
    console.log(err);
});
// 上述代碼會(huì)打印:
// promise1執(zhí)行成功
// promise2執(zhí)行成功

Promise.race方法

  • race方法是Promise類下的靜態(tài)方法,用于處理多個(gè)promise競速

現(xiàn)有一個(gè)這樣的業(yè)務(wù)場景需要接口A或者接口B的數(shù)據(jù)喊废,兩個(gè)接口不存在依賴,也不存在順序恭金,誰先返回我就用誰的數(shù)據(jù)

var promise1 = new Promise(function (resolve, reject) {
    //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
    setTimeout(function () {
        let success = true;
        if (success) {
            resolve('promise1執(zhí)行成功');
        } else {
            reject('失敗');
        }
    }, 1500)
});
var promise2 = new Promise(function (resolve, reject) {
    //方法體內(nèi)執(zhí)行異步操作如:文件讀寫ajax之類
    setTimeout(function () {
        let success = true;
        if (success) {
            resolve('promise2執(zhí)行成功');
        } else {
            reject('失敗');
        }
    }, 2000)
});
Promise.race([promise1,promise2]).then(function (data) {
    console.log(data);
}).catch(function (err) {
    console.log(err);
});
// 上述代碼會(huì)打印:
// promise1執(zhí)行成功

async/await

  • async關(guān)鍵字申明的該方法是一個(gè)異步方法,申明方法中的await申明的promise對(duì)象都會(huì)轉(zhuǎn)換為同步
  • await關(guān)鍵字阻塞promise對(duì)象使promise變?yōu)橥?/li>
  • await只能在async關(guān)鍵字申明的異步方法中使用
  • await等待的雖然是promise對(duì)象操禀,但不必寫.then(),直接可以得到resolve的返回值横腿。
  • 捕獲錯(cuò)誤用try catch
function asyncfun(time) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            let success = true;
            if (success) {
                resolve('成功');
            } else {
                reject('失敗');
            }
        }, time);
    });
}
/**
 * 使用async颓屑,await
 */
let load = async function() {
    console.log('開始');
    try {
        //直接可以得到resolve的返回值。
        let succ = await asyncfun(2000);
        console.log('2000'+succ);
        let succ1 = await asyncfun(1500);
        console.log('1500'+succ1);
    } catch (err) {
        //直接可以得到reject的返回值耿焊。
        console.log(err);
    }
    console.log('結(jié)束');
};
load();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揪惦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子罗侯,更是在濱河造成了極大的恐慌器腋,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钩杰,死亡現(xiàn)場離奇詭異纫塌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)讲弄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門措左,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人避除,你說我怎么就攤上這事怎披。” “怎么了瓶摆?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵凉逛,是天一觀的道長。 經(jīng)常有香客問我群井,道長状飞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任书斜,我火速辦了婚禮诬辈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菩佑。我一直安慰自己自晰,他們只是感情好凝化,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布稍坯。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞧哟。 梳的紋絲不亂的頭發(fā)上混巧,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音勤揩,去河邊找鬼咧党。 笑死,一個(gè)胖子當(dāng)著我的面吹牛陨亡,可吹牛的內(nèi)容都是我干的傍衡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼负蠕,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼蛙埂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遮糖,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤绣的,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后欲账,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屡江,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年赛不,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惩嘉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俄删,死狀恐怖宏怔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畴椰,我是刑警寧澤臊诊,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站斜脂,受9級(jí)特大地震影響抓艳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜帚戳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一玷或、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧片任,春花似錦偏友、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氛濒。三九已至,卻和暖如春鹅髓,著一層夾襖步出監(jiān)牢的瞬間舞竿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工窿冯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骗奖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓醒串,卻偏偏與公主長得像执桌,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芜赌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • Promise學(xué)習(xí)(上): 資料: JavaScript Promise迷你書 原著:azu / 翻譯:liubi...
    你隔壁的陌生人閱讀 557評(píng)論 0 1
  • 前言 本文旨在簡單講解一下javascript中的Promise對(duì)象的概念鼻吮,特性與簡單的使用方法。并在文末會(huì)附上一...
    _暮雨清秋_閱讀 2,183評(píng)論 0 3
  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案较鼓,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,698評(píng)論 1 56
  • Promise的含義 Promise 是異步編程的一種解決方案椎木,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)...
    YeLqgd閱讀 195評(píng)論 0 0
  • Promiese 簡單說就是一個(gè)容器,里面保存著某個(gè)未來才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果博烂,語法上說香椎,Pr...
    雨飛飛雨閱讀 3,348評(píng)論 0 19