async 與 promise 的區別

2022-06-25 20:12:12 字數 1341 閱讀 7558

async/await是基於promise實現的,他不能用於普通的**函式

async/await使得非同步**看起來像同步**

async/await與promise一樣,是非阻塞的。

const makerequest = () => )

} else

})}

這些**看著就頭痛。巢狀(6層),括號,return語句很容易讓人感到迷茫,而它們只是需要將最終結果傳遞到最外層的promise。

上面的**使用async/await編寫可以大大地提高可讀性:

const makerequest = async () =>  else 

}

const makerequest = () => )

})}

如果promise3不需要value1,可以很簡單地將promise巢狀鋪平。如果你忍受不了巢狀,你可以將value 1 & 2 放進promise.all來避免深層巢狀:

const makerequest = () => )

.then(([value1, value2]) => )

}

這種方法為了可讀性犧牲了語義。除了避免巢狀,並沒有其他理由將value1和value2放在乙個陣列中。

使用async/await的話,**會變得異常簡單和直觀

const makerequest = async () => 

const makerequest = () => )

}makerequest()

.catch(err => )

promise鏈中返回的錯誤棧沒有給出錯誤發生位置的線索。更糟糕的是,它會誤導我們;錯誤棧中唯一的函式名為callapromise,然而它和錯誤沒有關係。(檔名和行號還是有用的)。

然而,async/await中的錯誤棧會指向錯誤所在的函式:

const makerequest = async () => 

makerequest()

.catch(err => )

在開發環境中,這一點優勢並不大。但是,當你分析生產環境的錯誤日誌時,它將非常有用。這時,知道錯誤發生在makerequest比知道錯誤發生在then鏈中要好。

最後一點,也是非常重要的一點在於,async/await能夠使得**除錯更簡單。2個理由使得除錯promise變得非常痛苦:

使用await/async時,你不再需要那麼多箭頭函式,這樣你就可以像除錯同步**一樣跳過await語句。

promise與async和await的區別

什麼是async await?async await是寫非同步 的新方式,以前的方法有 函式和promise。async await是基於promise實現的,它不能用於普通的 函式。async await與promise一樣,是非阻塞的。async await使得非同步 看起來像同步 這正是它的魔...

promise與async和await的區別

什麼是async await?async await是寫非同步 的新方式,以前的方法有 函式和promise。async await是基於promise實現的,它不能用於普通的 函式。async await與promise一樣,是非阻塞的。async await使得非同步 看起來像同步 這正是它的魔...

promise 和 async 的用法

先構造乙個 promise 函式 resolve 和 reject 都是乙個函式 resolve 在成功時呼叫 reject 在失敗時呼叫 function promise 1000 else 1000 then 和 catch 第乙個引數為resolve狀態時的 第二個引數為reject狀態時的 ...