天天看點

Promise中的同步與異步

       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
           

以上為個人萌生興趣,探究出的結果。如果有誤歡迎在評論區中指出~

繼續閱讀