JavaScript的async/await和同步JavaScript看起來都差不多,都是讓程式等待,那么async/await的作用是什么?
比如說
異步JavaScript代碼
function getStudentList(){
return ['Adam'/span>, 'Ben'/span>]。
}
function findStudent(who) {
const list = getStudentList();
const found = list.some(student =>/span> student == who)。
console.log(found); //logs true。
}
findStudent('Adam'/span>)。
使用async/await的異步JavaScript
function getStudentList() {
return new Promise(resolve =>; {
setTimeout(() => resolve(['Adam', 'Ben'], 1000) 。
});
}
async function findStudent(who) {
const list = await getStudentList() 。
const found = list.some(student =>/span> student == who);
console.log(found)。
}
findStudent('Adam'/span>)。
在上面的代碼中,const list = getStudentList();和const list = await getStudentList();兩個功能都是同步代碼。
謝謝你
uj5u.com熱心網友回復:
同步函式/代碼是指逐行、逐項任務執行的代碼。無論一個特定的任務需要多少時間來執行,下一個任務在當前任務完成之前不會開始,換句話說,執行流程在每個任務中都被暫停/停止,并在當前任務完成后重新開始。
console.log("foo")。
console.log("bar")。
//執行這段代碼將記錄以下內容:
// foo
// bar
異步函式/呼叫是在某個時間點開始執行的代碼,然后即使第一個任務沒有完成,下一個任務也會被執行。所以它被執行,比如說,如果你想叫它平行時間線或執行緒。
這方面的一個例子是,有一個函式在3秒后記錄 "ASYNC"(假設我們有一個預定義的延遲函式,叫做sleep(seconds)):
async function foo(){
sleep(3); //等待3秒。
console.log("ASYNC") 。
}
console.log("foo")。
foo()。
console.log("bar")。
//執行這段代碼將記錄以下內容:
// foo
// bar
//ASYNC
注意,bar被記錄在ASYNC之前,盡管記錄后者的函式被首先呼叫。基本上異步函式不會停止執行流程,只是開始執行里面的代碼,并在呼叫后繼續執行下一行代碼,不管異步代碼是否已經完成。
有些時候,你確實希望在異步代碼中停止執行流程。假設你有一個名為x的變數,你希望有一個名為calculate()的和運算函式,其結果被存盤到x,但該函式是一個在線請求,執行時有一定的延遲(例如,1秒)。
let x = 0。
async main() {
console.log(x)。
x = calculate(5,8) 。
console.log(x)。
}
main()。
//執行這段代碼將記錄以下內容:
// 0
// {}
請注意,x的值并沒有像預期的那樣變成13,而是得到了一些奇怪的結果。這是因為請求開始執行,然后x的值在請求回傳總和之前就被記錄了,結果(取決于請求是如何作業的),x的值將是一些隨機的物件或null/undefined,直到請求結束,然后x將等于13。
為了解決這個問題,我們必須使用關鍵字await,它可以停止異步執行流,并等待另一個異步函式結束,直到流重新開始。
let x = 0。
async main() {
console.log(x)。
x = await calculate(5,8)。
console.log(x)。
}
main()。
//執行這段代碼將記錄以下內容,每條日志之間有1秒的延遲:
// 0
//13
附帶說明:await關鍵字不能在同步背景關系中使用,如
await someAsyncFunction()。
并且只在異步函式(即用async關鍵字定義的函式)之前使用。
因此,await只在異步函式中這樣的異步背景關系中使用:
async someAsyncFunction() {
//一些任務。
await anotherAsyncFunction()。
//一些更多的任務。
}
uj5u.com熱心網友回復:
你的第一個例子是同步的。它也更快。
。function getStudentList() {
return ['Adam'/span>, 'Ben'/span>]。
}
function findStudent(who){
const list = getStudentList(), found = list.includes(who);
console.log(found); /span> logs true.
}
console. time('sync'); findStudent('Adam'); console. timeEnd('sync');。
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
你的第二個例子是異步的,而且慢了大約一秒鐘。但是,你將無法測驗,除非你的async函式首先被解決。這就是為什么我使用了.then.
function getStudentList() {
return new Promise(>resolve=> {
setTimeout(() => resolve(['Adam', 'Ben']), 1000) 。
});
}
async function findStudent(who){
const list = await getStudentList(), found = list.includes(who);
console.log(found)。
}
console.time('async'/span>)。
findStudent('Adam').then(()=>{
console.timeEnd('async'/span>)。
});
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
你會注意到,arrayInstance.includes是一個更好的解決方案,可以找到某些東西是否在一個陣列中。順便說一下,在這種特殊情況下,使用async是沒有意義的。
下面是一個async的例子,它更有意義:
function delay(milliseconds){
return new Promise(>resolve=> {
setTimeout(()=>/span>{
resolve( milliseconds);
}, milliseconds)。
});
}
async function logicalAsync(){
let等待。
console.time('test')。
wait = await delay(1000)。
console.timeEnd('test')。
console.log(' milliseconds = ' wait);
}
logicalAsync()。
<iframe name="sif3" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
當然,同步代碼需要多長時間來執行,它下面的所有代碼都在等待上面的代碼完成處理。異步代碼允許下面的代碼在上面的代碼完成之前執行(可能)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/318049.html
標籤:
下一篇:承諾永不落空-NodeJS
