Днес ще проучим малко функцията за изчакване от най-високо ниво, въведена в ES2022, и ще обясним защо може да не я използвате във вашия проект по време на процеса на разработка, въпреки че това е страхотна добавка към функцията. Любопитен? Нека го копаем!
Очаквайте кратко въведение към най-високото ниво
Както знаете await
е характеристиката на асинхронния JavaScript и за да използваме await
трябва да имаме функция async
.
const msg = async () => { // async function
const res = await fetch('/message') // use of await
const data = await res.json()
console.log(data)
}
Използването на await
във функция, която няма асинхронен подпис, ще доведе до грешка.
const msg = () => { // no async const res = await fetch('/message') // error }
Както забелязвате, не можем да използваме await
без функция async
. Но ES2022 въведе функция за изчакване от най-високо ниво и използването й JavaScript ще разпознае модула като async
модул.
const language = 'english' // top level await const data = await import(`../messages/${language}`) const msg = () => { console.log(data) }
Забележете, че все още не можете да използвате await
в обхват на функция, който няма async
подпис.
const msg = () => { const language = 'english' const data = await fetch(`/messages/${language}`) // error }
Използване на await за зареждане на най-бързия ресурс
Използването на Promise.any
ще ви позволи да заредите ресурса, който първи извлича данните.
const data = await Promise.any([
fetch('/messages/english')
.then(response => response.json()),
fetch('/messages/default')
.then(response => response.json()),
])
data
може да се зареди или от /english
, или от /default
, което от двете се извлече първо.
Използване на чакане от най-високо ниво в Next.js
Най-новата версия на Next.js поддържа функцията за изчакване от най-високо ниво ES2022. И така, нека настроим проекта с най-новата версия на Next.js с поддръжка на TypeScript.
npx create-next-app@latest --typescript
Конфигурирайте Next.js за поддръжка на най-високо ниво на очакване
// next.config.js webpack: (config) => { config.experiments = { topLevelAwait: true, } return config } // tsconfig.json "compilerOptions": { "target": "es2017", }
Сега можете да използвате функцията за изчакване от най-високо ниво във вашето приложение Next.js.
const language = "english" const messages = await fetch(`/messages/${language}`) const data = await messages.json() const Home: NextPage = () => { return data.map((delivery, index) => ( <div key={index}>{delivery.time}</div> ) }
Готов си! Сега можете да видите данните, заредени от най-високото ниво, чакащи използване.
Може да излеете мнението си с уау тембър — динамично внасяне с await
. Но позволете ми да обясня защо не се нуждаете от него, докато използвате Next.js в следващия раздел.
Използване на getServerSideProps
Да, използвайки getServerSideProps
ще получите точно подобна функция в сравнение с функцията за изчакване от най-високо ниво. Освен това ще бъдат изобразени от сървъра данни за разлика от клиентските данни от най-високо ниво, чакащи при поискване.
const Home: NextPage = ({data}) => { return data.map((delivery, index) => ( <div key={index}>{delivery.time}</div> ) } export async function getServerSideProps() { const language = 'english' const res = await fetch(`/messages/${language}`) const data = await res.json() return { props: { data }, } }
Следователно, по мое мнение, не мисля, че ще имам нужда от функцията за изчакване от най-високо ниво на ES2022, докато използвам Next.js. Но познаването му ще ви помогне в бъдещия процес на развитие.
Възможно е обаче да има някои случаи, когато може да се наложи да използваме функцията за изчакване от най-високо ниво. Ако открия нещо специално, за което трябва да се нуждаем от функция за изчакване от най-високо ниво, тогава ще бъда публикуван тук. Дотогава, моля, споделете вашите отзиви или мнение в коментар...