亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Inhaltsverzeichnis
Was ist Async/Await?
Vergleichen Sie Promise, Co, Async/Await
Verwenden Sie die Promise-Kette
co搭配生成器函數(shù)
async/await
深入async/await
async返回值
async函數(shù)的異常
并行
Heim Web-Frontend Front-End-Fragen und Antworten Ist Async für es6 oder es7?

Ist Async für es6 oder es7?

Jan 29, 2023 pm 05:36 PM
es6 async await es7 async

async ist es7. Async und Wait sind neue Erg?nzungen zu ES7 und L?sungen für asynchrone Vorg?nge. Man kann sagen, dass Async/Await syntaktischer Zucker für Co-Module und Generatorfunktionen ist und js asynchronen Code mit klarerer Semantik l?st. Wie der Name schon sagt, bedeutet Async ?asynchron“. Async wird verwendet, um zu deklarieren, dass eine Funktion asynchron ist. Es gibt eine strikte Regel zwischen Async und Wait.

Ist Async für es6 oder es7?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, ECMAScript Version 6, Dell G3-Computer.

In ES7 (ES2017) vorgeschlagene asynchrone Front-End-Funktionen: asynchron, warten.

Was ist Async/Await?

Async und Wait sind neue Erg?nzungen in ES7. Für L?sungen für asynchrone Vorg?nge kann man sagen, dass Async/Await syntaktischer Zucker für Co-Module und Generatorfunktionen ist. L?sen Sie asynchronen js-Code mit klarerer Semantik.

async bedeutet, wie der Name schon sagt, ?asynchron“. Mit async wird erkl?rt, dass eine Funktion asynchron ist. Und Warten bedeutet w?rtlich ?Warten“ und wird verwendet, um auf den asynchronen Abschluss zu warten.

Async und Wait haben eine strenge Regel. Beide k?nnen nicht ohne einander leben. Wait kann jedoch nur in asynchronen Funktionen geschrieben werden.

Studenten, die mit dem Co-Modul vertraut sind, sollten wissen, dass das Co-Modul ein von Master TJ geschriebenes Modul ist, das eine Generatorfunktion zur L?sung asynchroner Prozesse verwendet. Es kann als Ausführer der Generatorfunktion angesehen werden. Async/await ist ein Upgrade des Co-Moduls. Es verfügt über einen integrierten Generatorfunktions-Executor und ist nicht mehr auf das Co-Modul angewiesen. Gleichzeitig gibt async Promise zurück.

Aus der oben genannten Sicht wird Promise als grundlegendste Einheit verwendet, unabh?ngig davon, ob es sich um das Co-Modul oder um Async/Await handelt. Schüler, die nicht viel über Promise wissen, k?nnen zun?chst mehr über Promise lernen.

Vergleichen Sie Promise, Co, Async/Await

Lassen Sie uns anhand eines einfachen Beispiels die ?hnlichkeiten, Unterschiede und Kompromisse zwischen den drei Methoden vergleichen.

Wir verwenden als Beispiel den NodeJS-Treiber von Mongodb, um die Mongodb-Datenbank abzufragen. Der Grund dafür ist, dass der JS-Treiber von Mongodb die Rückgabe von Promise standardm??ig implementiert hat und wir Promise nicht separat verpacken müssen.

Verwenden Sie die Promise-Kette

MongoClient.connect(url + db_name).then(db => {
    return db.collection('blogs');
}).then(coll => {
    return coll.find().toArray();
}).then(blogs => {
    console.log(blogs.length);
}).catch(err => {
    console.log(err);
})

Die then()-Methode von Promise kann ein anderes Promise oder einen synchronisierten Wert zurückgeben. Wenn ein synchronisierter Wert zurückgegeben wird, wird er in ein Promise gepackt. Im obigen Beispiel gibt db.collection() einen synchronisierten Wert zurück, d. h. ein Sammlungsobjekt, das jedoch in ein Promise eingeschlossen und transparent an die n?chste then()-Methode übergeben wird. Das obige Beispiel verwendet eine Promise-Kette. Stellen Sie zun?chst eine Verbindung zur Datenbank MongoClient her. connect () gibt ein Versprechen zurück, rufen Sie dann die Datenbankobjekt-Datenbank in der Methode then () ab, rufen Sie dann das Coll-Objekt ab und geben Sie es zurück. Rufen Sie das Coll-Objekt in der n?chsten then()-Methode ab, führen Sie dann eine Abfrage durch, geben Sie die Abfrageergebnisse zurück und rufen Sie die then()-Methode Schicht für Schicht auf, um eine Promise-Kette zu bilden. Wenn in dieser Promise-Kette eine Ausnahme in einem Link auftritt, wird diese vom letzten Catch() abgefangen. Man kann sagen, dass dieser mit der Promise-Kette geschriebene Code eleganter und der Prozess klarer ist als der schichtweise Aufruf von Callback-Funktionen. Rufen Sie zuerst das Datenbankobjekt ab, dann das Sammlungsobjekt und fragen Sie schlie?lich die Daten ab. Hier liegt jedoch ein nicht sehr ?elegantes“ Problem vor, n?mlich dass das von jeder then()-Methode erhaltene Objekt die von der vorherigen then()-Methode zurückgegebenen Daten sind. Es kann nicht schichtübergreifend darauf zugegriffen werden. Das bedeutet, dass wir im dritten Fall (blogs => {}) nur das Abfrageergebnis blogs erhalten, aber das obige DB-Objekt und Coll-Objekt nicht verwenden k?nnen. Was ist zu diesem Zeitpunkt, wenn Sie die Datenbank db.close() schlie?en m?chten, nachdem Sie die Blogliste ausgedruckt haben? Derzeit gibt es zwei L?sungen:

Die erste besteht darin, die Verschachtelung von then() zu verwenden. Wir unterbrechen die Promise-Kette und machen sie verschachtelt, genau wie bei der Verschachtelung von Callback-Funktionen:

MongoClient.connect(url + db_name).then(db => {
    let coll = db.collection('blogs');
    coll.find().toArray().then(blogs => {
        console.log(blogs.length);
        db.close();
    }).catch(err => {
        console.log(err);
    });
}).catch(err => {
    console.log(err);
})

Hier verschachteln wir zwei Promise, sodass im letzten Abfragevorgang das externe Datenbankobjekt aufgerufen werden kann. Diese Methode wird jedoch nicht empfohlen. Der Grund ist einfach: Wir sind von einer Art Callback-Funktionsh?lle zu einer anderen Promise-Callback-H?lle übergegangen.
Darüber hinaus müssen wir die Ausnahme jedes Versprechens abfangen, da Versprechen keine Kette bilden.

Es gibt eine andere M?glichkeit, n?mlich die Datenbank in jeder then()-Methode zu übergeben:

MongoClient.connect(url + db_name).then(db => {
    return {db:db,coll:db.collection('blogs')};
}).then(result => {
    return {db:result.db,blogs:result.coll.find().toArray()};
}).then(result => {
    return result.blogs.then(blogs => {   //注意這里,result.coll.find().toArray()返回的是一個Promise,因此這里需要再解析一層
        return {db:result.db,blogs:blogs}
    })
}).then(result => {
    console.log(result.blogs.length);
    result.db.close();
}).catch(err => {
    console.log(err);
});

Bei der Rückgabe jeder then()-Methode kombinieren wir die Datenbank und ihre anderen Ergebnisse jedes Mal in einer Objektrückgabe. Bitte beachten Sie, dass es in Ordnung ist, wenn jedes Ergebnis ein synchronisierter Wert ist. Wenn es sich jedoch um einen Promise-Wert handelt, erfordert jedes Promise eine zus?tzliche Analyseebene.
Im obigen Beispiel ist das von der zweiten then()-Methode zurückgegebene {db:result.db,blogs:result.coll.find().toArray()}對象中,blogs ein Promise. In der n?chsten then()-Methode k?nnen wir nicht direkt auf den Array-Wert der Blogliste verweisen, daher müssen wir then() aufrufen. Methode, um zuerst eine Ebene zu analysieren und dann die beiden Synchronisationswerte db und blogs zurückzugeben. Beachten Sie, dass dies die Verschachtelung von Promise beinhaltet, ein Promise jedoch nur eine Ebene von then() verschachtelt.

這種方式,也是很蛋疼的一個方式,因為如果遇到then()方法中返回的不是同步的值,而是Promise的話,我們需要多做很多工作。而且,每次都透傳一個“多余”的db對象,在邏輯上也有點冗余。

但除此之外,對于Promise鏈的使用,如果遇到上面的問題,好像也沒其他更好的方法解決了。我們只能根據(jù)場景去選擇一種“最優(yōu)”的方案,如果要使用Promise鏈的話。

鑒于Promise上面蛋疼的問題,TJ大神將ES6中的生成器函數(shù),用co模塊包裝了一下,以更優(yōu)雅的方式來解決上面的問題。

co搭配生成器函數(shù)

如果使用co模塊搭配生成器函數(shù),那么上面的例子可以改寫如下:

const co = require('co');
co(function* (){
    let db = yield MongoClient.connect(url + db_name);
    let coll = db.collection('blogs');
    let blogs = yield coll.find().toArray();
    console.log(blogs.length);
    db.close();
}).catch(err => {
    console.log(err);
});

co是一個函數(shù),將接受一個生成器函數(shù)作為參數(shù),去執(zhí)行這個生成器函數(shù)。生成器函數(shù)中使用yield關鍵字來“同步”獲取每個異步操作的值。
上面代碼在代碼形式上,比上面使用Promise鏈要優(yōu)雅,我們消滅了回調(diào)函數(shù),代碼看起來都是同步的。除了使用co和yield有點怪之外。

使用co模塊,我們要將所有的操作包裝成一個生成器函數(shù),然后使用co()去調(diào)用這個生成器函數(shù)。看上去也還可以接受,但是ES的進化是不滿足于此的,于是async/await被提到了ES7的提案。

async/await

我們先看一下使用async/await改寫上面的代碼:

(async function(){
    let db = await MongoClient.connect(url + db_name);
    let coll = db.collection('blogs');
    let blogs = await coll.find().toArray();
    console.log(blogs.length);
    db.close();
})().catch(err => {
    console.log(err);
});

我們對比代碼可以看出,async/await和co兩種方式代碼極為相似。co換成了async,yield換成了await。同時生成器函數(shù)變成了普通函數(shù)。這種方式在語義上更加清晰明了,async表明這個函數(shù)是異步的,同時await表示要“等待”異步操作返回值。

async函數(shù)返回一個Promise,上面的代碼其實是這樣:

let getBlogs = async function(){
    let db = await MongoClient.connect(url + db_name);
    let coll = db.collection('blogs');
    let blogs = await coll.find().toArray();
    db.close();
    return blogs;
};
getBlogs().then(result => {
    console.log(result.length);
}).catch(err => {
    console.log(err);
})

我們定義getBlogs為一個async函數(shù),最后返回得到的博客列表最終會被包裝成一個Promise返回,如上,我們直接調(diào)用getBlogs().then()方法可獲取async函數(shù)返回值。

好了,上面我們簡單對比了一下三種解決異步方案,下面我們來深入了解一下async/await。

深入async/await

async返回值

async用于定義一個異步函數(shù),該函數(shù)返回一個Promise。
如果async函數(shù)返回的是一個同步的值,這個值將被包裝成一個理解resolve的Promise,等同于return Promise.resolve(value)。
await用于一個異步操作之前,表示要“等待”這個異步操作的返回值。await也可以用于一個同步的值。

//返回一個Promise
let timer = async function timer(){
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            resolve('500');
        },500);
    });
}
timer().then(result => {
  console.log(result);  //500
}).catch(err => {
    console.log(err.message);
});
//返回一個同步的值
let sayHi = async function sayHi(){
  let hi = await 'hello world';   
  return hi;  //等同于return Promise.resolve(hi);
}
sayHi().then(result => {
  console.log(result);
});

上面這個例子返回是一個同步的值,字符串’hello world’,sayHi()是一個async函數(shù),返回值被包裝成一個Promise,可以調(diào)用then()方法獲取返回值。對于一個同步的值,可以使用await,也可以不使用await。效果效果是一樣的。具體用不用,看情況。

比如上面使用mongodb查詢博客那個例子,let coll = db.collection('blogs');,這里我們就沒有用await,因為這是一個同步的值。當然,也可以使用await,這樣會顯得代碼統(tǒng)一。雖然效果是一樣的。

async函數(shù)的異常

let sayHi = async function sayHi(){
    throw new Error('出錯了');
}
sayHi().then(result => {
  console.log(result);
}).catch(err => {
    console.log(err.message);   //出錯了
});

我們直接在async函數(shù)中拋出一個異常,由于返回的是一個Promise,因此,這個異常可以調(diào)用返回Promise的catch()方法捕捉到。

和Promise鏈的對比:
我們的async函數(shù)中可以包含多個異步操作,其異常和Promise鏈有相同之處,如果有一個Promise被reject()那么后面的將不會再進行。

let count = ()=>{
    return new Promise((resolve,reject) => {
        setTimeout(()=>{
            reject('故意拋出錯誤');
        },500);
    });
}
let list = ()=>{
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve([1,2,3]);
        },500);
    });
}
let getList = async ()=>{
    let c = await count();
    let l = await list();
    return {count:c,list:l};
}
console.time('begin');
getList().then(result => {
    console.log(result);
}).catch(err => {
    console.timeEnd('begin');
    console.log(err);
});
//begin: 507.490ms
//故意拋出錯誤

如上面的代碼,定義兩個異步操作,count和list,使用setTimeout延時500毫秒,count故意直接拋出異常,從輸出結果來看,count()拋出異常后,直接由catch()捕捉到了,list()并沒有繼續(xù)執(zhí)行。

并行

使用async后,我們上面的例子都是串行的。比如上個list()和count()的例子,我們可以將這個例子用作分頁查詢數(shù)據(jù)的場景。先查詢出數(shù)據(jù)庫中總共有多少條記錄,然后再根據(jù)分頁條件查詢分頁數(shù)據(jù),最后返回分頁數(shù)據(jù)以及分頁信息。

我們上面的例子count()和list()有個“先后順序”,即我們先查的總數(shù),然后又查的列表。其實,這兩個操作并無先后關聯(lián)性,我們可以異步的同時進行查詢,然后等到所有結果都返回時再拼裝數(shù)據(jù)即可。

let count = ()=>{
    return new Promise((resolve,reject) => {
        setTimeout(()=>{
            resolve(100);
        },500);
    });
}
let list = ()=>{
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve([1,2,3]);
        },500);
    });
}
let getList = async ()=>{
    let result = await Promise.all([count(),list()]);
    return result;
}
console.time('begin');
getList().then(result => {
    console.timeEnd('begin');  //begin: 505.557ms
    console.log(result);       //[ 100, [ 1, 2, 3 ] ]
}).catch(err => {
    console.timeEnd('begin');
    console.log(err);
});

我們將count()和list()使用Promise.all()“同時”執(zhí)行,這里count()和list()可以看作是“并行”執(zhí)行的,所耗時間將是兩個異步操作中耗時最長的耗時。

Das Endergebnis ist ein Array, das aus den Ergebnissen der beiden Operationen besteht. Wir müssen nur die Werte im Array der Reihe nach herausnehmen.

【Empfohlenes Lernen: Javascript-Video-Tutorial

Das obige ist der detaillierte Inhalt vonIst Async für es6 oder es7?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So kehren Sie ein Array in ES6 um So kehren Sie ein Array in ES6 um Oct 26, 2022 pm 06:19 PM

In ES6 k?nnen Sie die Methode reverse() des Array-Objekts verwenden, um eine Array-Umkehrung zu erreichen. Diese Methode wird verwendet, um die Reihenfolge der Elemente im Array umzukehren, wobei das letzte Element zuerst und das erste Element zuletzt gesetzt wird .umkehren()". Die Methode reverse() ?ndert das ursprüngliche Array. Wenn Sie es nicht ?ndern m?chten, müssen Sie es mit dem Erweiterungsoperator ?…“ verwenden. Die Syntax lautet ?[...array].reverse()“. ".

Ist Async für es6 oder es7? Ist Async für es6 oder es7? Jan 29, 2023 pm 05:36 PM

async ist es7. Async und Wait sind neue Erg?nzungen zu ES7 und L?sungen für asynchrone Vorg?nge. Man kann sagen, dass Async/Await syntaktischer Zucker für Co-Module und Generatorfunktionen ist und js asynchronen Code mit klarerer Semantik l?st. Wie der Name schon sagt, bedeutet Async ?asynchron“. Async wird verwendet, um zu deklarieren, dass eine Funktion asynchron ist. Es gibt eine strikte Regel zwischen Async und Wait.

Warum muss das Miniprogramm es6 in es5 konvertieren? Warum muss das Miniprogramm es6 in es5 konvertieren? Nov 21, 2022 pm 06:15 PM

Aus Gründen der Browserkompatibilit?t. Als neue Spezifikation für JS fügt ES6 viele neue Syntax und API hinzu. Moderne Browser bieten jedoch keine umfassende Unterstützung für die neuen Funktionen von ES6, daher muss ES6-Code in ES5-Code konvertiert werden. In den WeChat-Webentwicklertools wird babel standardm??ig verwendet, um den ES6-Syntaxcode des Entwicklers in ES5-Code umzuwandeln, der von allen drei Terminals gut unterstützt wird und Entwicklern hilft, Entwicklungsprobleme zu l?sen, die durch unterschiedliche Umgebungen nur im Projekt verursacht werden Option ?ES6 bis ES5“.

So finden Sie in es6 verschiedene Elemente in zwei Arrays So finden Sie in es6 verschiedene Elemente in zwei Arrays Nov 01, 2022 pm 06:07 PM

Schritte: 1. Konvertieren Sie die beiden Arrays jeweils in Mengentypen mit der Syntax ?newA=new Set(a); newB=new Set(b);“ 2. Verwenden Sie has() und filter(), um den Differenzsatz zu finden Mit der Syntax ?new Set([...newA].filter(x =>!newB.has(x)))“ werden die Differenzmengenelemente in eine Mengensammlung aufgenommen und zurückgegeben. 3. Verwenden Sie Array. from, um die Menge in einen Array-Typ umzuwandeln, Syntax ?Array.from(collection)“.

So implementieren Sie die Array-Deduplizierung in es5 und es6 So implementieren Sie die Array-Deduplizierung in es5 und es6 Jan 16, 2023 pm 05:09 PM

In es5 k?nnen Sie die for-Anweisung und die Funktion indexOf() verwenden, um eine Array-Deduplizierung zu erreichen. Die Syntax ?for(i=0;i<array length;i++){a=newArr.indexOf(arr[i]);if( a== -1){...}}". In es6 k?nnen Sie den Spread-Operator Array.from() und Set verwenden, um Duplikate zu entfernen. Sie müssen zuerst das Array in ein Set-Objekt konvertieren, um Duplikate zu entfernen, und dann den Spread-Operator oder die Funktion Array.from() verwenden Konvertieren Sie das Set-Objekt zurück in ein Array.

Was bedeutet die tempor?re Totzone von es6? Was bedeutet die tempor?re Totzone von es6? Jan 03, 2023 pm 03:56 PM

In es6 handelt es sich bei der tempor?ren Totzone um einen Syntaxfehler, der sich auf die Befehle let und const bezieht, die dafür sorgen, dass der Block einen geschlossenen Bereich bildet. Bevor eine Variable innerhalb eines Codeblocks mit dem Befehl let/const deklariert wird, ist sie nicht verfügbar und geh?rt zur ?toten Zone“ der Variablen, bevor die Variable deklariert wird. ES6 legt fest, dass die Variablenheraufstufung in tempor?ren Totzonen und in let- und const-Anweisungen nicht erfolgt, haupts?chlich um Laufzeitfehler zu reduzieren und zu verhindern, dass die Variable vor ihrer Deklaration verwendet wird, was zu unerwartetem Verhalten führen kann.

So bestimmen Sie, wie viele Elemente sich in einem Array in es6 befinden So bestimmen Sie, wie viele Elemente sich in einem Array in es6 befinden Jan 18, 2023 pm 07:22 PM

In es6 k?nnen Sie das L?ngenattribut des Array-Objekts verwenden, um zu bestimmen, wie viele Elemente sich im Array befinden. Um die Anzahl der Elemente im Array zu ermitteln, kann dieses Attribut einfach die Anzahl der Elemente im Array zurückgeben Verwenden Sie die Anweisung ?array.length“. Gibt einen Wert zurück, der die Anzahl der Elemente des Array-Objekts darstellt, also den L?ngenwert.

Wird der ES6-Import Variablen f?rdern? Wird der ES6-Import Variablen f?rdern? Jan 18, 2023 pm 07:44 PM

Der ES6-Import führt zu einer Variablenheraufstufung. Beim Hochziehen von Variablen wird eine Variablendeklaration an den Anfang ihres Gültigkeitsbereichs verschoben. js muss die Kompilierungs- und Ausführungsphase durchlaufen. W?hrend der Kompilierungsphase werden alle Variablendeklarationen im Voraus erfasst, w?hrend andere Anweisungen ihre Reihenfolge nicht ?ndern ausgeführt, und der zweite Teil wird nur ausgeführt, wenn die Anweisung in der Ausführungsphase ausgeführt wird.

See all articles