Promise是ES6出來的用來處理異步調用的方式。他是一個資料的載體 / 期約 / 承諾,一段時間後内部執行結束會傳回承諾的結果。本文不讨論他的使用,隻讨論promise中的同步異步。
1. Promise本身是同步的
promise是處理異步的一個方式,通常和異步操作一起出現。但是不要錯誤認為Promise是本身就是異步執行,其實他是同步調用。
new Promise((resolve,reject)=>{
console.log(1)
})
console.log(2)
執行結果
-----------------------------------------
1
2
2. resolve是同步的
從下面代碼中可以看出resolve中的代碼是立即執行的,如果resolve中是異步調用,在執行棧中就沒有指派一說,那麼輸出應為1,而實際是輸出了100。
var num = 1
Promise.resolve(num=100)
console.log(num)
執行結果
----------------------------------------
100
上面代碼也可以這麼寫:
var num = 1
new Promise((resolve,reject)=>{
resolve(num=100)
console.log(num)
})
console.log('同步',num)
執行結果
-----------------------------------------
100
同步 100
3.then是異步(微隊列)的
js異步任務是在任務隊列中排隊,等主執行棧結束後才會去執行隊列中滿足執行條件的異步操作。
任務隊列分為兩種:微隊列和宏隊列。
微隊列執行順序優于宏隊列,整體執行順序為:執行棧-->微隊列-->宏隊列。
then中的任務就是排在微隊列中。大部分任務執行在宏隊列中如:settimeout。
new Promise((resolve, reject) => {
// 宏隊列
setTimeout(() => console.log(3), 0);
resolve(2);
}).then((e) => console.log(e));// 微隊列
console.log(1);
執行結果
---------------------------------------------
1
2
3
4.catch是異步(微隊列)的
catch和then是相同的,都是微任務隊列中的。
new Promise((resolve, reject) => {
setTimeout(()=>console.log(2),0)
throw new Error("自定義錯誤")
})
.then(e => console.log(e))
.catch(err=>console.log('接受到錯誤',err)) // 微隊列
console.log(1);
執行結果
---------------------------------------------
1
接受到錯誤 Error: 自定義錯誤
...
2