一、async
async
是一種關鍵字,用於指示函數是非同步的。在非同步函數中,JavaScript不會被阻塞,可以在等待操作完成的同時繼續執行其他代碼。
舉個例子,下面這個函數使用setTimeout
模擬了一個非同步操作並返回結果:
async function example() {
return new Promise(resolve => {
setTimeout(() => {
resolve("Hello, World!");
}, 1000);
});
}
這個函數返回一個Promise
對象,Promise
最終會被解決(resolve)為字元串 “Hello, World!”,但是在這個函數中,我們不需要等待1秒鐘才能獲得結果。
我們可以使用async/await
語法糖輕鬆地獲取非同步函數返回的結果,而不需要嵌套使用.then
或.catch
鏈。
二、asynchronous
asynchronous
與async
類似,但是它是一個修飾符,用於修飾函數或方法,標記它是非同步的。使用asynchronous
修飾符,可以讓你的代碼更加易讀清晰明了。
這裡沒有什麼需要說明的例子,下面這段代碼展示了如何使用asynchronous
修飾符修飾函數:
asynchronous function example() {
return new Promise(resolve => {
setTimeout(() => {
resolve("Hello, World!");
}, 1000);
});
}
三、async音標
async音標 /ə’sɪŋkrənəs/,源自英文單詞asynchronous的發音。
四、async await
async/await
是ES6/ES2017中引入的語法糖,它簡化了非同步代碼的書寫。使用async/await
,可以在不需要嵌套使用.then
或.catch
鏈的情況下,直接獲取非同步函數返回的結果。
下面的代碼是上面例子的非同步版本,使用async/await
直接從example
函數中獲取返回值。
async function main() {
const result = await example();
console.log(result); // 列印出 "Hello, World!"
}
五、promise區別
與使用async/await
直接獲取非同步函數返回值相比,使用Promise
可能更加繁瑣。在這裡,我們簡單介紹一下使用Promise
手動處理非同步函數的流程。
首先,我們需要使用new Promise()
創建一個Promise
對象,並將非同步操作包裹在其中。在非同步操作完成時,我們調用resolve()
方法將結果封裝在Promise
對象中。
下面的例子展示了如何使用Promise
實現非同步代碼:
function example() {
return new Promise(resolve => {
setTimeout(() => {
resolve("Hello, World!");
}, 1000);
});
}
function main() {
example().then(result => {
console.log(result); // 列印出 "Hello, World!"
});
}
六、python async
Python也有內置非同步支持,你可以使用asyncio
模塊在Python代碼中編寫非同步函數。
下面這個例子展示了一個簡單的Python非同步函數:
import asyncio
async def example():
await asyncio.sleep(1)
return "Hello, World!"
async def main():
result = await example()
print(result) # 列印出 "Hello, World!"
asyncio.run(main())
七、enableasync代碼
enableasync
是一個開源的JavaScript庫,它提供了一些工具,幫助你在應用中實現非同步模式。
下面這個例子展示了如何在一個Node.js
應用中使用enableasync
:
const enableasync = require("enableasync");
const EXAMPLE_MS = 1000;
const exampleFunction = enableasync(function(cb) {
setTimeout(function() {
cb(null, "Hello, World!");
}, EXAMPLE_MS);
});
exampleFunction(function(err, result) {
if (err) {
console.error(err);
} else {
console.log(result); // 列印出 "Hello, World!"
}
});
上面的代碼中,我們使用了enableasync
包裝了一個非同步函數exampleFunction
,需要注意的是,使用enableasync
包裝時需要將非同步回調處理函數作為唯一參數傳入。
在exampleFunction
完成時,使用cb
回調函數傳遞非同步結果,並且將其作為第二個參數傳入。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/182433.html