因為js是單執行緒的,所以一旦代碼中有報錯,就不會執行下面的了,如下333就未列印
console.log(111)
throw Error(222)
console.log(333)
好像與promise沒關系,哈哈,
1.傳說中的 setInterval 與 setTimeout
它們是單獨的執行緒執行計數的(因為 JavaScript 引擎是單執行緒的, 如果處于阻塞執行緒狀態就會影響記計時的準確),
它們并不會阻塞js的執行,如下代碼先列印的是222
let timer = setTimeout(()=>{
console.log(111);
},1000)
console.log(222);
這時候如果我們想等到111列印后再列印222怎么辦(實際專案中并不提倡使用延時器),代碼如下
new Promise((resolve,reject)=>{
let timer = setTimeout(()=>{
console.log(111);
resolve();
},1000)
}).then(()=>{
console.log(222);
})
2.異步 http 請求執行緒
XMLHttpRequest 在連接后是通過瀏覽器新開一個執行緒請求,所以它與js也是異步的
所以現在大多數請求的方式,想axios,fetch等其實都已經用promise封裝過了(請求成功resolve()失敗reject()),比如常遇到的當我獲取到請求的資料(走then對應resolve)或請求失敗(走catch對應reject)后在進行一系列操作,但是當對多個請求的回傳值同時處理的時候就會造成嵌套,這樣會使代碼顯得非常冗長丑陋,難以維護,所以這時候就用到了await,例如:
const init = async ()=>{
let a = await axios().catch(err=>err);
let b = await axios().catch(err=>err);
let c = await axios().catch(err=>err);
return a&&a.num&&b&&b.num&&c&&c.num&&a+b+c
}
最后附上Promise.all和Promise.race的使用理解
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/106471.html
標籤:JavaScript
上一篇:vuex的模塊化使用
下一篇:前端節流的簡單筆記
