JS學習 非同步

2022-10-06 11:33:13 字數 4201 閱讀 1572

** (callback) 是作為引數傳遞給另乙個函式的函式。

這種技術允許函式呼叫另乙個函式。

**函式可以在另乙個函式完成後執行。

j**ascript 函式按照它們被呼叫的順序執行。而不是以它們被定義的順序。

// txt = "goodbye"

let txt;

function mydisplayer(some)

function myfirst()

function mysecond()

myfirst();

mysecond();

// 假設您要進行計算,然後賦值。

let txt;

function mydisplayer(some)

function mycalculator(num1, num2)

let result = mycalculator(5, 5);

mydisplayer(result);

// 或者,可以呼叫 mycalculator,並讓 mycalculator 函式呼叫 mydisplayer

let txt;

function mydisplayer(some)

function mycalculator(num1, num2)

mycalculator(5, 5);

**是作為引數傳遞給另乙個函式的函式。

// 使用**,可以通過**呼叫 mydisplayer,並在計算完成後讓 mycalculator 執行**

let txt;

function mydisplayer(some)

function mycalculator(num1, num2, mycallback)

mycalculator(5, 5, mydisplayer);

與其他函式並行執行的函式稱為非同步(asynchronous)。

**最常與非同步函式一起使用。

j**ascript 中有很多關於非同步函式的例子,在這裡只列舉了 settimeout() 和 setinterval()

在使用 j**ascript 函式 settimeout() 時,可以指定超時時執行的**函式

// myfunction 被用作**。函式(函式名)作為引數傳遞給 settimeout()。

// 3000 是超時前的毫秒數,所以 3 秒後會呼叫 myfunction()。

let txt;

settimeout(myfunction, 3000);

function myfunction()

注意:將函式作為引數傳遞時,請記住不要使用括號。

// 若不將函式的名稱作為引數傳遞給另乙個函式,始終可以傳遞整個函式

// function() 用作**。它是乙個完整的函式。完整的函式作為引數被傳遞給 settimeout()。

// 3000 是超時前的毫秒數,所以 3 秒後會呼叫 myfunction()。

let txt;

settimeout(function() , 3000);

function myfunction(value)

在使用 j**ascript 函式 setinterval() 時,可以指定每個間隔執行的**函式

// 1000 是間隔之間的毫秒數,因此 myfunction() 將每秒呼叫一次

let count = 0;

setinterval(myfunction, 1000);

function myfunction()

j**ascript promise 物件包含生產**和對消費**的呼叫

let mypromise = new promise(function(myresolve, myreject) );

// "consuming code" (必須等待乙個兌現的承諾)

mypromise.then(

function(value) ,

function(error)

);

當執行**獲得結果時,它應該呼叫兩個**之一:

結果呼叫

成功myresolve(result value)

出錯myreject(error object)

j**ascript promise 物件可以是:

當 promise 物件 "pending"(工作)時,結果是 undefined。

當 promise 物件 "fulfilled" 時,結果是乙個值。

當 promise 物件 "rejected" 時,結果是乙個錯誤物件。

mypromise.state

mypromise.result

"pending"

undefined

"fulfilled"

結果值"rejected"

error 物件

注意:無法訪問 promise 屬性 state 和 result。必須使用 promise 方法來處理 promise。

// promise.then() 有兩個引數,乙個是成功時的**,另乙個是失敗時的**。

// 兩者都是可選的,因此您可以為成功或失敗新增**。

mypromise.then(

function(value) ,

function(error)

);// mypromise 判斷後把 myresolve() 作為**函式,然後執行 function(value)

// txt ="ok"

let txt;

function mydisplayer(some)

let mypromise = new promise(function(myresolve, myreject) else

});mypromise.then(

function(value) ,

function(error)

);

// settimeout() 使用 promise 的例子

let txt;

let mypromise = new promise(function(myresolve, myreject) , 3000);

});mypromise.then(function(value) );

函式前的關鍵字 async 使函式返回 promise

async function myfunction() 

myfunction().then(

function(value) ,

function(error)

);// 或者更簡單,因為期望正常值(正常響應,而不是錯誤)

async function myfunction()

myfunction().then(

function(value)

);

函式前的關鍵字 await 使函式等待 promise

注意:await 關鍵字只能在 async 函式中使用。

// txt = "i love you !!"

let txt;

async function mydisplay() );

txt = await mypromise;

}mydisplay();

// settimeout() 使用 async/await 的例子

// 3 秒後 txt = "i love you !!"

let txt;

async function mydisplay() , 3000);

});txt = await mypromise;

}mydisplay();

JS非同步機制

js非同步機制 主線程不斷讀取執行棧中的同步事件,直到執行棧空 非同步任務結束放入任務佇列,執行棧空時主線程讀取任務佇列 任務佇列讀取完畢,回到步驟1 巨集任務與微任務 巨集任務 script 整體 settimeout setinterval ui 渲染 i o postmessage messa...

JS 非同步載入

參考學習 有關promise的學習 如果 async async 指令碼相對於頁面的其餘部分非同步地執行 當頁面繼續進行解析時,指令碼將被執行 如果不使用 async 且defer defer 指令碼將在頁面完成解析時執行 如果既不使用 async 也不使用 defer 在瀏覽器繼續解析頁面之前,立...

js的非同步載入

今天被問到了如何非同步載入js,聽到這句話我內心是拒絕的,啥玩意兒?js也要用非同步載入不是引入了就行了,也沒見速度變慢啊。後來仔細查詢了一下,才發現自己原來還是太年輕了。因為之前自己寫的載入的都是本地js,或者是並沒有複雜邏輯運算的js,導致看不出來太大問題,查完資料後,要將不會的記在這裡,當作學...