Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。它由社區最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了Promise對象。
基本用法
ES6 規定,Promise對象是一個構造函數,用來生成Promise實例。下面代碼創造了一個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) {
// 成功時執行的代碼塊
}, function(err) {
// 失敗時執行的代碼塊
});
// 等同于
promise.then(function(data) { //cb
// 成功時執行的代碼塊
}).catch(function(err) {
// 失敗時執行的代碼塊
});
其他promise方法
promise.all()【返回一個 Promise
實例,此實例在 iterable
參數內所有的 promise
都“完成(resolved)”或參數中不包含 promise
時回調完成(resolve);如果參數中 promise
有一個失敗(rejected),此實例回調失?。╮eject),失敗原因的是第一個失敗 promise
的結果
】
Promise.all([p1,p2,p3]).then(res=>{
console.log(res)
})
promise.race()【返回一個 promise,一旦迭代器中的某個promise解決或拒絕,返回的 promise就會解決或拒絕?!?/p>
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)標準引入了 async 函數,使得異步操作變得更加方便。async 函數是什么?一句話,它就是 Generator 函數的語法糖。使異步代碼變成同步執行。
基本用法
async函數返回一個 Promise 對象,可以使用then方法添加回調函數。當函數執行的時候,一旦遇到await就會先返回,等到異步操作完成,再接著執行函數體內后面的語句。
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函數和普通函數一樣按順序執行,同時,在執行到await語句時,返回一個Promise對象
await可以理解為將async函數掛起,直到等待的Promise被fulfill或者reject,再繼續執行之后的代碼
async函數的返回值和普通Promise沒有區別