因為js是單線程的,所以一旦代碼中有報錯,就不會執行下麵的了,如下333就未列印 console.log(111)throw Error(222)console.log(333) 好像與promise沒關係,哈哈。 1.傳說中的 setInterval 與 setTimeout它們是單獨的線程執行計 ...
因為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的使用理解