并發(fā)與并行的區(qū)別?
并發(fā)是宏觀概念,我分別有任務A 和 任務B,在一段時間內(nèi)通過任務間切換完成了這兩個任務,這種情況就可以稱之為并發(fā)。
并行是微觀概念,假設CPU 中存在兩個核心,那么我就可以同時完成任務A、B。同時完成多個任務的情況可以稱之為并行。
回調(diào)地獄
回調(diào)地獄的根本問題:
- 嵌套函數(shù)存在耦合性,一旦有所改動,就會牽一發(fā)而動全身
- 嵌套函數(shù)一多,就很難處理錯誤。
- 不能使用
try catch,不能直接return。
Promise
涉及面試題:Promise的特點是什么,分別有什么優(yōu)缺點?什么是Promise鏈?promise 構造函數(shù)執(zhí)行和then 函數(shù)執(zhí)行有什么區(qū)別?
Promise 翻譯過來就是承諾的意思,這個承諾會在未來有一個確切的答復,并且改承諾有三種狀態(tài),分別是:
- 等待中 (pending)
- 完成了 (resolved)
- 拒絕了 (rejected)
這個承諾一旦從等待狀態(tài)變成為其他狀態(tài)永遠不能更改狀態(tài)了,也就是說一旦狀態(tài)變?yōu)?resolved后,就不能再次改變。
var promise = new Promise ((resolve, reject) => {
if (異步操作成功) {
resolve(value)
} else {
異步操作失敗
reject(new Error())
}
})
當我們在構造 Promise 的時候,構造函數(shù)內(nèi)部的代碼是立即執(zhí)行的。
new Promise((resolve, reject) => {
console.log('new Promise')
resolve('success')
})
console.log('finish')
Promise 實現(xiàn)了鏈式調(diào)用,也就是說每次調(diào)用 then 之后返回的都是一個 Promise ,并且是一個全新的 Promise,原因也是因為狀態(tài)不可變。如果你在 then 中 使用了 return,那么 return 的值會被 Promise.resolve() 包裝
Promise.resolve(1)
.then(res => {
console.log(res)
return 2
})
.then(res => {
console.log(res)
})
輸出 => 1 2
使用 Promise 加載圖片
// 加載圖片
let preloadImage = function (path) {
return new Promise((resolve, reject) => {
let image = new Image()
image.onload = resolve
image.onerror = reject
iamge.src = path
})
}
異步終極解決方案 async 和 await
await 我們從名字可以看出來意思是等待異步的意思,即它可以讓異步回調(diào)變得像同步函數(shù),并且會阻塞下一步,但是!這一切都是發(fā)生在async中的,而async是異步的,所以整個js并不會被阻塞。所以await要寫在async中。當然單純的await和async是并不能解決問題??梢钥吹竭€是需要promise的。
// async await
// 異步方法一
function takeLongTime() {
return new Promise((resolve, reject) => {
setTimeout(()=> resolve(10), 1000)
})
}
// 異步方法二
function takeLongTime2(v) {
console.log(v)
return new Promise(resolve => {
setTimeout(() => resolve(v + 20), 10)
})
}
async function test() {
// 先執(zhí)行 takeLongTime 然后 執(zhí)行 takeLongTime2
// 將 takeLongTime 中得到的結果傳給takleLongTime2中
const v = await takeLongTime()
const b = await takeLongTime2(v)
console.log(b)
}
// 執(zhí)行 test 方法
test()
// 輸出結果為 10 30