javascript - Varför måste vi använda nyckelorden async och await för att göra det synkront i node, när nyckelordet bokstavligen är async?
Så jag tänkte att ok, Node är asynkront (vilket betyder att flera kodrader körs samtidigt), så varför använder vi nyckelordet async (som bokstavligen betyder asynkront) för att vänta på att en uppgift ska bli klar med nyckelordet await (vilket gör det synkront). Varför finns det inte ett nyckelord sync, eftersom det är det vi gör? Kan någon snälla förklara logiken med nyckelordet async? Jag är så förvirrad.
Svar #1
Nyckelordet async möjliggör användning av await, vilket bara är en mer strömlinjeformad syntax för att skriva kod med löften (promises) och asynkrona operationer. Det gör ingenting synkront. Det låter dig bara använda liknande programmeringstekniker som synkron kod, men allt är fortfarande asynkront.
Kan någon vänligen förklara logiken bakom nyckelordet async? Jag är så förvirrad.
När du använder async-nyckelordet för att deklarera en funktion skapar du en annan typ av funktion som ALLTID returnerar ett löfte (promise). Detta är endast användbart för asynkron programmering - därav async-nyckelordets koppling till termen "asynkron".
Vidare gör async-nyckelordet inget synkront. Det tillåter dig att använda en mer synkron-liknande programmeringsmodell som är mycket enklare att använda, särskilt för saker som villkorliga grenar i asynkron kontrollflöde, men ingenting som var asynkront blir faktiskt synkront.
Som ett exempel på hur ingenting blir synkront, kör detta exempel i kodsnutten och notera ordningen på console.log()-uttalandena. async-funktionen returnerar när den träffar första await och resten av exekveringen fortsätter medan den asynkrona operationen fortfarande pågår. Detta är en simulering med en timer, men den timern kan vara vilken annan asynkron operation som helst, såsom en http-förfrågan, en databasoperation, etc...
function delay(t) {
return new Promise(resolve => {
setTimeout(resolve, t);
});
}
async function run() {
console.log("in run() 1");
await delay(100);
console.log("in run() 2");
}
console.log("before run()");
run();
console.log("after run()");Du kan se från att köra detta lilla exempel, att run()-funktionen får sin körning pausad så snart du når await och den returnerar vilket tillåter annan kod efter funktionsanropet att köras. Sedan, någon gång senare när timern går och delay()-löftet löses, återupptar run()-funktionen där den blev pausad och kör resten av funktionskroppen.
Detta är operationellt detsamma som denna kod som använder .then() istället för async och await:
function delay(t) {
return new Promise(resolve => {
setTimeout(resolve, t);
});
}
function run() {
console.log("in run() 1");
delay(100).then(() => {
console.log("in run() 2");
});
}
console.log("before run()");
run();
console.log("after run()");Svar #2
Node.js är inte "asynkront", utan Node.js har istället en uppsättning asynkrona API:er.
För att besvara din fråga om async/await - async/await är bara syntaktiskt socker eftersom det använder promises under huven.
