Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強大矮湘。它由社區(qū)最早提出和實現(xiàn)刹衫,ES6 將其寫進了語言標(biāo)準(zhǔn)醋寝,統(tǒng)一了用法搞挣,原生提供了Promise對象。
基本用法
ES6 規(guī)定音羞,Promise對象是一個構(gòu)造函數(shù)囱桨,用來生成Promise實例。下面代碼創(chuàng)造了一個Promise實例嗅绰。
new Promise(function(resolve,reject){
console.log('Promise');
resolve();
}).then(function(){
console.log('resolved.');
})
console.log('Hi!');
// Promise
// Hi!
// resolved
錯誤捕獲
promise.then(function(data) {
// 成功時執(zhí)行的代碼塊
}, function(err) {
// 失敗時執(zhí)行的代碼塊
});
// 等同于
promise.then(function(data) { //cb
// 成功時執(zhí)行的代碼塊
}).catch(function(err) {
// 失敗時執(zhí)行的代碼塊
});
其他promise方法
promise.all()【返回一個 Promise
實例舍肠,此實例在 iterable
參數(shù)內(nèi)所有的 promise
都“完成(resolved)”或參數(shù)中不包含 promise
時回調(diào)完成(resolve);如果參數(shù)中 promise
有一個失敯煜荨(rejected)貌夕,此實例回調(diào)失敗(reject)民镜,失敗原因的是第一個失敗 promise
的結(jié)果
】
Promise.all([p1,p2,p3]).then(res=>{
console.log(res)
})
promise.race()【返回一個 promise啡专,一旦迭代器中的某個promise解決或拒絕,返回的 promise就會解決或拒絕制圈∶峭】
var promise1 = new Promise(function(resolve, reject) {
setTimeout(resolve, 500, 'one');
});
var promise2 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then(function(value) {
console.log(value);
});
// two
async/awite
ES2017 (ES7)標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便鲸鹦。async 函數(shù)是什么慧库?一句話,它就是 Generator 函數(shù)的語法糖馋嗜。使異步代碼變成同步執(zhí)行齐板。
基本用法
async函數(shù)返回一個 Promise 對象,可以使用then方法添加回調(diào)函數(shù)葛菇。當(dāng)函數(shù)執(zhí)行的時候甘磨,一旦遇到await就會先返回,等到異步操作完成眯停,再接著執(zhí)行函數(shù)體內(nèi)后面的語句济舆。
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
asyncPrint('hello world', 50);
上面代碼指定 50 毫秒以后,輸出hello world莺债。
返回Promise對象
async function f() {
return 'hello world';
}
f().then(v => console.log(v))
// "hello world"
注意點:
async函數(shù)和普通函數(shù)一樣按順序執(zhí)行滋觉,同時,在執(zhí)行到await語句時齐邦,返回一個Promise對象
await可以理解為將async函數(shù)掛起椎侠,直到等待的Promise被fulfill或者reject,再繼續(xù)執(zhí)行之后的代碼
async函數(shù)的返回值和普通Promise沒有區(qū)別