看了一些技術博客但是感覺太過於抽象難懂,所以自己搞一個。
回調地獄
https://www.cnblogs.com/suihang/p/9595548.html
如連接文章所示的回調地獄例子
//假設有五個計時器,在第一個計時器執行完後執行第二個,第二個執行完畢後執行第三個,以此類推
huidiaodiyu(){
setTimeout(function(){
console.log('第一個計時器');
setTimeout(function(){
console.log('第二個計時器');
setTimeout(function(){
console.log('第三個計時器');
setTimeout(function(){
console.log('第四個計時器');
},200)
},200)
},200)
},200)
}
例子中的四個計時器是相互獨立(異步操作),如果要實現同步,則需要嵌套方法,等待上一個條件完成後才能進行下一個操作。
promise的存在就是爲了解決回調地獄的問題
Promise
Promise
有三種狀態:pending/reslove/reject 。pending就是未決,resolve可以理解爲成功,reject可以理解爲拒絕。
創建一個promise:
const promise = new Promise((resolve, reject) => {
// do something here ...
if (success) {
resolve(value); // value爲執行成功後傳遞到then的值
} else {
reject(error); // rejected
}
});
通過then
方法,分別指定resolved狀態和rejected狀態的回調函數。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
promise的方法
1.promise.all()
一個腳本中有多個promise時,監控多個Promise對象執行完成
promiseTest(){
var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve,reject) => {
setTimeout(resolve,100,'foo')
});
Promise.all([p1,p2,p3]).then(values => {
console.log(values);
}).catch(err => {
//如果p1/p2/p3有任一返回失敗時,那麼整體立即返回失敗,返回的錯誤信息是第一個失敗的promise結果
console.log(err);
});
}
打印結果:
其中p1,p3的數據類型是object promise,p2是1337,Promise.all([p1,p2,p3]):把promise打包,扔到一個數組裏面,打包完還是一個promise對象.最後必須確保所有promise對象都是resolve狀態
2.promise.race()
與all的不同之處在於,只要有一個是resolve狀態就可以返回
3.promise.resolve()
將現有的東西,轉成一個Promise對象,且是resolve成功狀態
4.Promise.reject()
將現有的東西,轉成一個Promise對象,且是reject失敗狀態
傳入的參數會原封不動的作爲 reject 函數的理由,並不會因爲傳入的參數 Promise 或者是 thenable 對象而有所不同