1.以下純屬個(gè)人理解
同步:程序執(zhí)行完這個(gè)任務(wù)后在執(zhí)行下一個(gè)任務(wù)蛮粮,需要等待
異步:不用等待,任務(wù)同時(shí)執(zhí)行优烧,分為并發(fā)和并行兩種實(shí)現(xiàn)方式
并行:多個(gè)不同任務(wù)同時(shí)異步進(jìn)行
并發(fā):通過(guò)分配時(shí)間片的方式執(zhí)行多個(gè)任務(wù)蝉揍,使任務(wù)看起來(lái)并行
io密集型的任務(wù):適合單線程異步并發(fā)操作
計(jì)算量大的任務(wù):適合多線程并行操作链峭,可以讓每一個(gè)cpu核心被最大利用
2.JavaScript兩種異步方式(單線程編程語(yǔ)言):
參考: 玄蕭 https://www.bilibili.com/read/cv13486386?from=note 出處:bilibili
單線程優(yōu)點(diǎn): 由于所有操作運(yùn)行在一個(gè)線程中畦娄,無(wú)需考慮線程同步和資源競(jìng)爭(zhēng)的開(kāi)銷(xiāo),避免了線程之間的頻繁切換和競(jìng)爭(zhēng)問(wèn)題弊仪,降低了開(kāi)銷(xiāo)熙卡。
2.1 傳統(tǒng)回調(diào)函數(shù) (Callback Function) 例如 setTimeOut
回調(diào)函數(shù)缺點(diǎn): 函數(shù)回調(diào)地獄 : 一個(gè)函數(shù)執(zhí)行完在執(zhí)行內(nèi)部另外一個(gè),一層一層嵌套励饵,
2.2 Promise (承諾) : 寓意這個(gè)去這個(gè)請(qǐng)求會(huì)在未來(lái)某一個(gè)時(shí)刻返回
解決了回調(diào)地獄的問(wèn)題
例如:
fetch 向服務(wù)器請(qǐng)求驳癌,返回Promise對(duì)象,渲染前端,如果可以使用then 進(jìn)行接受 返回的結(jié)果
fetch("https://www.cmz.om").then((res)=>{
})
Promise優(yōu)點(diǎn):我們可以用鏈?zhǔn)浇Y(jié)構(gòu)將多個(gè)異步操作串聯(lián)起來(lái)如下
可以不斷追加類似java8 stream役听,這樣的鏈?zhǔn)秸{(diào)用避免了層層嵌套颓鲜,一個(gè)人東西的出現(xiàn)一定是解決某類問(wèn)題
fetch("https://www.cmz.om").then((res)=>{
console.log(“c”)
}).then(res=>{
console.log(“m”)
}).then(res=>{
console.log(“z")
2.3 async/ await
一句話概括:
語(yǔ)法糖,讓異步操作變簡(jiǎn)單的典予,這兩關(guān)鍵字基本同根同生甜滨, 被 async 修飾的 funcation 接受 請(qǐng)求必須用 await
async function F(){
const respnse = await fetc('https:///');
const json = await response.json
}
多個(gè)Promise 使用時(shí)會(huì)打破并行,第一個(gè)執(zhí)行完才執(zhí)行第二個(gè)瘤袖。
高效做法:
Promise.all內(nèi)可以傳遞多個(gè)promise對(duì)象
然后再使用await 衣摩,效率會(huì)提升一倍
const [a,b]= await Promise.all([promiseA,promiseB])
如果想使用 循環(huán)中的 所有操作都并發(fā)執(zhí)行可以使用 for await
async funcation f(){
const promises =[
someAsyncOperator();
someAsyncOperator();
someAsyncOperator();
];
for await (let result of promises){
}
}
不能在全局和 普通函數(shù) 中使用 await關(guān)鍵字,只能被應(yīng)用異步捂敌,所以想要使用 await 就必須 用 async修飾函數(shù)