一、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
微信掃一掃
支付寶掃一掃