Inhaltsverzeichnis
Asynchrone Durchquerung
Traversal of asynchronous iterable
Generierung von asynchronem Iterable
异步方法和异步生成器
Heim Web-Frontend js-Tutorial Detaillierte Erläuterung der neuen Funktion Async-Iteration in ES9

Detaillierte Erläuterung der neuen Funktion Async-Iteration in ES9

Apr 20, 2021 am 09:49 AM
新特性

Detaillierte Erläuterung der neuen Funktion Async-Iteration in ES9

In ES6 wurde das Konzept der synchronen Iteration mit der Referenz des Async-Operators in ES8 eingeführt. Kann es in einer asynchronen Operation durchlaufen werden?

Heute möchte ich Ihnen etwas über die neue Funktion der asynchronen Traversierung in ES9, die asynchrone Iteration, erzählen.

Asynchrone Durchquerung


Bevor wir die asynchrone Durchquerung erklären, erinnern wir uns zunächst an die synchrone Durchquerung in ES6.

Gemäß der Definition von ES6 besteht die Iteration hauptsächlich aus drei Teilen:

1. Iterable

Schauen wir uns zunächst die Definition von Iterable an:

interface Iterable {
    [Symbol.iterator]() : Iterator;
}
Nach dem Login kopieren

Iterable bedeutet, dass in diesem Objekt übertragbare Daten vorhanden sind, und Es ist notwendig, eine Factory-Methode zu implementieren, um einen Iterator zu generieren.

2. Iterator

interface Iterator {
    next() : IteratorResult;
}
Nach dem Login kopieren

Iterator kann aus Iterable erstellt werden. Iterator ist ein Cursor-ähnliches Konzept, und auf IteratorResult kann über next zugegriffen werden.

3. IteratorResult

IteratorResult sind die Daten, die bei jedem Aufruf der nächsten Methode erhalten werden.

interface IteratorResult {
    value: any;
    done: boolean;
}
Nach dem Login kopieren

Neben einem Wert, der die abzurufenden Daten angibt, verfügt IteratorResult auch über einen Wert, der angibt, ob die Durchquerung abgeschlossen ist.

Das Folgende ist ein Beispiel für das Durchlaufen eines Arrays:

rrree

Aber das obige Beispiel durchläuft synchrone Daten, z. B. eine von der http-Seite heruntergeladene Datei, wir möchten die Datei Zeile für Zeile durchlaufen. Da das Lesen einer Datenzeile ein asynchroner Vorgang ist, beinhaltet dies einen asynchronen Datendurchlauf.

Die Methode zum Hinzufügen des asynchronen Lesens von Dateien ist readLinesFromFile, daher ist die synchrone Durchlaufmethode nicht mehr auf asynchron anwendbar:

> const iterable = ['a', 'b'];
> const iterator = iterable[Symbol.iterator]();
> iterator.next()
{ value: 'a', done: false }
> iterator.next()
{ value: 'b', done: false }
> iterator.next()
{ value: undefined, done: true }
Nach dem Login kopieren

Vielleicht denken Sie, können wir das asynchrone Lesen einer Zeile in Promise kapseln und sie dann durchlaufen? synchron?

Die Idee ist gut, aber in diesem Fall ist es unmöglich zu erkennen, ob der asynchrone Vorgang abgeschlossen ist. Die Methode ist also nicht durchführbar.

Daher führte ES9 das Konzept der asynchronen Durchquerung ein:

  • Sie können den Iterator in asynchronen Iterables über Symbol.asyncIterator abrufen.

  • Die next()-Methode des asynchronen Iterators gibt ein Promises-Objekt zurück, das IteratorResults enthält.

Schauen wir uns also die API-Definition der asynchronen Durchquerung an:

//不再适用
for (const line of readLinesFromFile(fileName)) {
    console.log(line);
}
Nach dem Login kopieren

Schauen wir uns eine Anwendung der asynchronen Durchquerung an:

interface AsyncIterable {
    [Symbol.asyncIterator]() : AsyncIterator;
}
interface AsyncIterator {
    next() : Promise<IteratorResult>;
}
interface IteratorResult {
    value: any;
    done: boolean;
}
Nach dem Login kopieren

Unter anderem konvertiert createAsyncIterable eine synchrone Iterable in eine asynchrone Iterable, was wir weiter unten tun werden Schauen wir uns in diesem Abschnitt an, wie es generiert wird.

Hier konzentrieren wir uns hauptsächlich auf die Traversaloperation von asyncIterator.

Da der Async-Operator in ES8 eingeführt wurde, können wir den obigen Code auch mit Async-Funktionen umschreiben:

const asyncIterable = createAsyncIterable([&#39;a&#39;, &#39;b&#39;]);
const asyncIterator = asyncIterable[Symbol.asyncIterator]();
asyncIterator.next()
.then(iterResult1 => {
    console.log(iterResult1); // { value: &#39;a&#39;, done: false }
    return asyncIterator.next();
})
.then(iterResult2 => {
    console.log(iterResult2); // { value: &#39;b&#39;, done: false }
    return asyncIterator.next();
})
.then(iterResult3 => {
    console.log(iterResult3); // { value: undefined, done: true }
});
Nach dem Login kopieren

Traversal of asynchronous iterable


Verwenden Sie for-of, um synchron iterable zu durchlaufen, verwenden Sie for-await -of can asynchron iterierbar durchqueren.

async function f() {
    const asyncIterable = createAsyncIterable([&#39;a&#39;, &#39;b&#39;]);
    const asyncIterator = asyncIterable[Symbol.asyncIterator]();
    console.log(await asyncIterator.next());
        // { value: &#39;a&#39;, done: false }
    console.log(await asyncIterator.next());
        // { value: &#39;b&#39;, done: false }
    console.log(await asyncIterator.next());
        // { value: undefined, done: true }
}
Nach dem Login kopieren

Beachten Sie, dass „await“ in der asynchronen Funktion platziert werden muss.

Wenn während unseres asynchronen Durchlaufs eine Ausnahme auftritt, können Sie try Catch in for-await-of verwenden, um die Ausnahme abzufangen:

async function f() {
    for await (const x of createAsyncIterable([&#39;a&#39;, &#39;b&#39;])) {
        console.log(x);
    }
}
// Output:
// a
// b
Nach dem Login kopieren

Synchronized iterable gibt synchrone Iteratoren zurück, und die nächste Methode gibt {value, done } zurück.

Wenn Sie „for-await-of“ verwenden, werden synchrone Iteratoren in asynchrone Iteratoren umgewandelt. Der zurückgegebene Wert wird dann in ein Promise umgewandelt.

Wenn der vom synchronen nächsten zurückgegebene Wert selbst ein Promise-Objekt ist, ist der asynchrone Rückgabewert immer noch dasselbe Versprechen.

Das heißt, es wird: Iterable<Promise<T>> 转换成为 AsyncIterable<T>, wie im folgenden Beispiel gezeigt:

function createRejectingIterable() {
    return {
        [Symbol.asyncIterator]() {
            return this;
        },
        next() {
            return Promise.reject(new Error(&#39;Problem!&#39;));
        },
    };
}
(async function () { 
    try {
        for await (const x of createRejectingIterable()) {
            console.log(x);
        }
    } catch (e) {
        console.error(e);
            // Error: Problem!
    }
})();
Nach dem Login kopieren

Das obige Beispiel wandelt ein synchrones Promise in ein asynchrones Promise um.

async function main() {
    const syncIterable = [
        Promise.resolve(&#39;a&#39;),
        Promise.resolve(&#39;b&#39;),
    ];
    for await (const x of syncIterable) {
        console.log(x);
    }
}
main();

// Output:
// a
// b
Nach dem Login kopieren

Das obige Beispiel konvertiert synchronisierte Konstanten in Promise. Es ist ersichtlich, dass die Ergebnisse beider gleich sind.

Generierung von asynchronem Iterable


Zurück zum obigen Beispiel: Wir verwenden createAsyncIterable(syncIterable), um syncIterable in AsyncIterable zu konvertieren.

Sehen wir uns an, wie diese Methode implementiert wird:

async function main() {
    for await (const x of [&#39;a&#39;, &#39;b&#39;]) {
        console.log(x);
    }
}
main();

// Output:
// c
// d
Nach dem Login kopieren

Im obigen Code fügen wir async vor einer gewöhnlichen Generatorfunktion ein, die einen asynchronen Generator darstellt.

Bei gewöhnlichen Generatoren wird bei jedem Aufruf der nächsten Methode ein Objekt {value,done} zurückgegeben. Dieses Objekt kapselt den Ertragswert.

Bei einem Asynchrongenerator wird jedes Mal, wenn die nächste Methode aufgerufen wird, ein Versprechensobjekt zurückgegeben, das das Objekt {value,done} enthält. Dieses Objektobjekt ist eine Kapselung des Ertragswerts.

Da ein Promise-Objekt zurückgegeben wird, müssen wir nicht warten, bis das Ergebnis der asynchronen Ausführung abgeschlossen ist, bevor wir die nächste Methode erneut aufrufen.

Wir können alle asynchronen Promise-Operationen gleichzeitig über ein Promise.all ausführen:

async function* createAsyncIterable(syncIterable) {
    for (const elem of syncIterable) {
        yield elem;
    }
}
Nach dem Login kopieren

In createAsyncIterable erstellen wir ein asynchrones Iterable aus einem synchronen Iterable.

Als nächstes schauen wir uns an, wie man aus einem asynchronen Iterable ein asynchrones Iterable erstellt.

Wir wissen aus dem vorherigen Abschnitt, dass Sie „for-await-of“ verwenden können, um asynchrone iterierbare Daten zu lesen, also können wir es wie folgt verwenden:

async function* prefixLines(asyncIterable) {
    for await (const line of asyncIterable) {
        yield &#39;> &#39; + line;
    }
}
Nach dem Login kopieren

在generator一文中,我们讲到了在generator中调用generator。也就是在一个生产器中通过使用yield*来调用另外一个生成器。

同样的,如果是在异步生成器中,我们可以做同样的事情:

async function* gen1() {
    yield &#39;a&#39;;
    yield &#39;b&#39;;
    return 2;
}
async function* gen2() {
    const result = yield* gen1(); 
        // result === 2
}

(async function () {
    for await (const x of gen2()) {
        console.log(x);
    }
})();
// Output:
// a
// b
Nach dem Login kopieren

如果在异步生成器中抛出异常,这个异常也会被封装在Promise中:

async function* asyncGenerator() {
    throw new Error(&#39;Problem!&#39;);
}
asyncGenerator().next()
.catch(err => console.log(err)); // Error: Problem!
Nach dem Login kopieren

异步方法和异步生成器


异步方法是使用async function 声明的方法,它会返回一个Promise对象。

function中的return或throw异常会作为返回的Promise中的value。

(async function () {
    return &#39;hello&#39;;
})()
.then(x => console.log(x)); // hello

(async function () {
    throw new Error(&#39;Problem!&#39;);
})()
.catch(x => console.error(x)); // Error: Problem!
Nach dem Login kopieren

异步生成器是使用 async function * 申明的方法。它会返回一个异步的iterable。

通过调用iterable的next方法,将会返回一个Promise。异步生成器中yield 的值会用来填充Promise的值。如果在生成器中抛出了异常,同样会被Promise捕获到。

async function* gen() {
    yield &#39;hello&#39;;
}
const genObj = gen();
genObj.next().then(x => console.log(x));
    // { value: &#39;hello&#39;, done: false }
Nach dem Login kopieren

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/es9-async-iteration/

更多编程相关知识,请访问:编程视频!!

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der neuen Funktion Async-Iteration in ES9. 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

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.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

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)

PHP 8.3 veröffentlicht: Neue Features auf einen Blick PHP 8.3 veröffentlicht: Neue Features auf einen Blick Nov 27, 2023 pm 12:52 PM

PHP8.3 veröffentlicht: Überblick über neue Funktionen Da sich die Technologie weiterentwickelt und sich ändern muss, werden Programmiersprachen ständig aktualisiert und verbessert. PHP ist eine in der Webentwicklung weit verbreitete Skriptsprache und wurde ständig verbessert, um Entwicklern leistungsfähigere und effizientere Tools zur Verfügung zu stellen. Die kürzlich veröffentlichte PHP 8.3-Version bringt viele lang erwartete neue Funktionen und Verbesserungen. Werfen wir einen Blick auf einen Überblick über diese neuen Funktionen. Initialisierung von Nicht-Null-Eigenschaften Wenn in früheren Versionen von PHP einer Klasseneigenschaft nicht explizit ein Wert zugewiesen wurde, ist es ihr Wert

Ein Leitfaden zum Erlernen der neuen Funktionen von PHP8 und zum Erwerb eines tiefgreifenden Verständnisses der neuesten Technologie Ein Leitfaden zum Erlernen der neuen Funktionen von PHP8 und zum Erwerb eines tiefgreifenden Verständnisses der neuesten Technologie Dec 23, 2023 pm 01:16 PM

Eine ausführliche Analyse der neuen Funktionen von PHP8, um Ihnen zu helfen, die neueste Technologie zu beherrschen. Im Laufe der Zeit hat sich die Programmiersprache PHP ständig weiterentwickelt und verbessert. Die kürzlich veröffentlichte PHP8-Version bietet Entwicklern viele spannende neue Funktionen und Verbesserungen, die unsere Entwicklungsarbeit komfortabler und effizienter machen. In diesem Artikel analysieren wir die neuen Funktionen von PHP8 eingehend und stellen spezifische Codebeispiele bereit, die Ihnen helfen, diese neuesten Technologien besser zu beherrschen. Der JIT-Compiler PHP8 führt die JIT-Kompilierung (Just-In-Time) ein

Neue Redis-Erweiterung in PHP8.1 eingeführt Neue Redis-Erweiterung in PHP8.1 eingeführt Jul 07, 2023 pm 09:41 PM

Die in PHP8.1 eingeführte neue Redis-Erweiterung Mit der rasanten Entwicklung des Internets müssen große Datenmengen gespeichert und verarbeitet werden. Um die Effizienz und Leistung der Datenverarbeitung zu verbessern, ist Caching zu einem unverzichtbaren Bestandteil geworden. In der PHP-Entwicklung wird Redis als leistungsstarkes Schlüsselwertspeichersystem häufig in Caching- und Datenspeicherszenarien eingesetzt. Um die Erfahrung bei der Verwendung von Redis in PHP weiter zu verbessern, führt PHP8.1 eine neue Redis-Erweiterung ein. In diesem Artikel werden die neuen Funktionen dieser Erweiterung vorgestellt und bereitgestellt

Ein Überblick über die neuen Funktionen von CSS3: So erzielen Sie mit CSS3 Übergangseffekte Ein Überblick über die neuen Funktionen von CSS3: So erzielen Sie mit CSS3 Übergangseffekte Sep 09, 2023 am 11:27 AM

Übersicht über die neuen Funktionen von CSS3: So erzielen Sie mit CSS3 Übergangseffekte. CSS3 ist die neueste Version von CSS. Unter den vielen neuen Funktionen dürfte der Übergangseffekt die interessanteste und praktischste sein. Übergangseffekte können unsere Seiten während der Interaktion flüssiger und schöner machen und den Benutzern ein gutes visuelles Erlebnis bieten. In diesem Artikel wird die grundlegende Verwendung von CSS3-Übergangseffekten mit entsprechenden Codebeispielen vorgestellt. Attribut „transition-property“: Geben Sie den CSS-Eigenschaftsübergangseffekt an, der überführt werden muss

Interpretation neuer Funktionen der Go-Sprache: effizientere Programmierung Interpretation neuer Funktionen der Go-Sprache: effizientere Programmierung Mar 10, 2024 pm 12:27 PM

[Interpretation neuer Funktionen der Go-Sprache: Um die Programmierung effizienter zu gestalten, sind spezifische Codebeispiele erforderlich.] In den letzten Jahren hat die Go-Sprache im Bereich der Softwareentwicklung große Aufmerksamkeit auf sich gezogen, und ihr einfaches und effizientes Designkonzept hat immer mehr Aufmerksamkeit erregt Entwickler. Als statisch typisierte Programmiersprache führt die Go-Sprache weiterhin neue Funktionen ein, um die Entwicklungseffizienz zu verbessern und den Code-Schreibprozess zu vereinfachen. In diesem Artikel werden die neuesten Funktionen der Go-Sprache ausführlich erläutert und anhand spezifischer Codebeispiele erläutert, wie Sie den Komfort dieser neuen Funktionen erleben können. Modulare Entwicklung (GoModules) Go-Sprache ab 1

Was sind die neuen Funktionen von PHP8? Was sind die neuen Funktionen von PHP8? Sep 25, 2023 pm 01:34 PM

Zu den neuen Funktionen von PHP8 gehören JIT-Compiler, Typableitung, benannte Parameter, Union-Typen, Eigenschaften, Verbesserungen bei der Fehlerbehandlung, Unterstützung für asynchrone Programmierung, neue Standardbibliotheksfunktionen und anonyme Klassenerweiterungen. Detaillierte Einführung: 1. JIT-Compiler, PHP8 führt den JIT-Compiler ein, der eine wichtige Leistungsverbesserung darstellt. Der JIT-Compiler kann einige hochfrequente Ausführungscodes in Echtzeit kompilieren und optimieren, wodurch die Ausführungsgeschwindigkeit verbessert wird führt die Typinferenzfunktion ein, die es Entwicklern ermöglicht, beim Deklarieren von Variablen usw. automatisch den Typ von Variablen abzuleiten.

Überblick über die neuen Funktionen von CSS3: So verwenden Sie CSS3, um ein horizontal zentriertes Layout zu erreichen Überblick über die neuen Funktionen von CSS3: So verwenden Sie CSS3, um ein horizontal zentriertes Layout zu erreichen Sep 09, 2023 pm 04:09 PM

Überblick über die neuen Funktionen von CSS3: So verwenden Sie CSS3, um ein horizontal zentriertes Layout zu erreichen. Bei Webdesign und -layout ist ein horizontal zentriertes Layout eine häufige Anforderung. In der Vergangenheit haben wir dazu oft komplexe JavaScript- oder CSS-Tricks eingesetzt. Mit CSS3 wurden jedoch einige neue Funktionen eingeführt, die horizontal zentrierte Layouts einfacher und flexibler machen. In diesem Artikel werden einige neue Funktionen von CSS3 vorgestellt und einige Codebeispiele bereitgestellt, um zu veranschaulichen, wie Sie mit CSS3 ein horizontal zentriertes Layout erreichen. 1. Verwenden Sie Flexbox zum Layouten der Datei

Was sind die neuen Funktionen der Go-Sprache? Was sind die neuen Funktionen der Go-Sprache? Aug 24, 2023 pm 01:36 PM

Die neuen Funktionen der Go-Sprache sind: 1. Go-Modul, das zum Verwalten der Abhängigkeiten von Go-Sprachprojekten verwendet wird. 2. Fehlerbehandlung, Hinzufügen eines neuen Fehlertyps, wodurch die Fehlerbehandlung flexibler und präziser wird. 3. Kontextpaket, verwendet zum Übertragen von Anforderungsbereichswerten zwischen Goroutinen; 4. Einbettung, das heißt, eine Struktur kann in eine andere Struktur eingebettet werden. 5. Synchronisierungspaket, um die Synchronisation und Kommunikation zwischen Goroutinen besser zu steuern 7. Generika ermöglichen es Entwicklern, flexibler zu schreiben.

See all articles