| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/fromAsync | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Januar 2024 browserbergreifend verfgbar.
Die statische Methode Array.fromAsync() erstellt eine neue, flach kopierte Array-Instanz aus einem asynchronen Iterable, einem Iterable oder einem array-hnlichen Objekt.
Array.fromAsync(items)
Array.fromAsync(items, mapFn)
Array.fromAsync(items, mapFn, thisArg)
itemsEin asynchrones Iterable, Iterable oder array-hnliches Objekt, das in ein Array konvertiert werden soll.
mapFn OptionalEine Funktion, die auf jedes Element des Arrays angewendet wird. Wenn bereitgestellt, wird jeder Wert, der dem Array hinzugefgt werden soll, zuerst durch diese Funktion geleitet, und der Rckgabewert von mapFn wird stattdessen dem Array hinzugefgt (nachdem er awaited wurde). Die Funktion wird mit den folgenden Argumenten aufgerufen:
elementDas aktuelle Element, das im Array verarbeitet wird. Wenn items ein synchrones Iterable oder array-hnliches Objekt ist, werden alle Elemente zuerst awaited, und element wird nie ein thenable sein. Wenn items ein asynchrones Iterable ist, wird jeder erzeugte Wert unverndert bergeben.
indexDer Index des aktuellen Elements, das im Array verarbeitet wird.
thisArg OptionalWert, der als this beim Ausfhren von mapFn verwendet werden soll.
Ein neues Promise, dessen Erfllungswert eine neue Array-Instanz ist.
Array.fromAsync() ermglicht es, Arrays zu erstellen aus:
ReadableStream und AsyncGenerator); oder, wenn das Objekt nicht asynchron iterierbar ist,Map und Set); oder, wenn das Objekt nicht iterierbar ist,length-Eigenschaft und indizierten Elementen).Array.fromAsync() iteriert das asynchrone Iterable auf eine Art und Weise, die sehr hnlich zu for await...of ist. Array.fromAsync(items) ist im Allgemeinen quivalent zu folgendem Code, wenn items ein asynchrones Iterable oder synchrones Iterable ist:
const result = [];
for await (const element of items) {
result.push(element);
}
Array.fromAsync() ist in Bezug auf das Verhalten fast gleichwertig mit Array.from(), auer den folgenden Unterschieden:
Array.fromAsync() verarbeitet asynchrone Iterable-Objekte.Array.fromAsync() gibt ein Promise zurck, das sich zum Array-Instanz erfllt.Array.fromAsync() mit einem nicht-asynchronen Iterable-Objekt aufgerufen wird, wird jedes Element, das zum Array hinzugefgt werden soll, zuerst awaited.mapFn bereitgestellt wird, wird dessen Ausgabe ebenfalls intern awaited.Array.fromAsync() und Promise.all() knnen beide ein Iterable von Promises in ein Promise eines Arrays umwandeln. Es gibt jedoch zwei wesentliche Unterschiede:
Array.fromAsync() wartet auf jeden Wert, der aus dem Objekt erzeugt wird, nacheinander. Promise.all() wartet auf alle Werte gleichzeitig.Array.fromAsync() iteriert das Iterable trge und holt nicht den nchsten Wert, bevor der aktuelle geklrt ist. Promise.all() holt alle Werte im Voraus und wartet auf sie alle.const asyncIterable = (async function* () {
for (let i = 0; i < 5; i++) {
await new Promise((resolve) => setTimeout(resolve, 10 * i));
yield i;
}
})();
Array.fromAsync(asyncIterable).then((array) => console.log(array));
// [0, 1, 2, 3, 4]
Wenn items ein asynchrones Iterable ist, bei dem jeder Ergebniswert auch ein Promise ist, werden diese Promises ohne Awaiting dem resultierenden Array hinzugefgt. Dies ist konsistent mit dem Verhalten von for await...of.
function createAsyncIter() {
let i = 0;
return {
[Symbol.asyncIterator]() {
return {
async next() {
if (i > 2) return { done: true };
i++;
return { value: Promise.resolve(i), done: false };
},
};
},
};
}
Array.fromAsync(createAsyncIter()).then((array) => console.log(array));
// (3) [Promise, Promise, Promise]
Hinweis:
In der Praxis werden Sie selten ein asynchrones Iterable finden, das Promises liefert, da, wenn Sie es mit einer asynchronen Generatorfunktion implementieren, der yield-Ausdruck automatisch Promises entpackt.
Array.fromAsync(
new Map([
[1, 2],
[3, 4],
]),
).then((array) => console.log(array));
// [[1, 2], [3, 4]]
Array.fromAsync(
new Set([Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)]),
).then((array) => console.log(array));
// [1, 2, 3]
Array.fromAsync({
length: 3,
0: Promise.resolve(1),
1: Promise.resolve(2),
2: Promise.resolve(3),
}).then((array) => console.log(array));
// [1, 2, 3]
Wenn items ein synchrones Iterable oder array-hnliches Objekt ist, werden sowohl der Eingang als auch die Ausgabe von mapFn intern von Array.fromAsync() awaited.
function delayedValue(v) {
return new Promise((resolve) => setTimeout(() => resolve(v), 100));
}
Array.fromAsync(
[delayedValue(1), delayedValue(2), delayedValue(3)],
(element) => delayedValue(element * 2),
).then((array) => console.log(array));
// [2, 4, 6]
Wenn items ein asynchrones Iterable ist, wird der Eingang zu mapFn nicht awaited, die Ausgabe jedoch schon. Unter Verwendung der gleichen Funktion createAsyncIter wie oben:
Array.fromAsync(createAsyncIter(), async (element) => (await element) * 2).then(
(array) => console.log(array),
);
// [2, 4, 6]
Interessanterweise bedeutet dies, dass Array.fromAsync(createAsyncIter()) nicht quivalent zu Array.fromAsync(createAsyncIter(), (element) => element) ist, da letzteres jeden erzeugten Wert awaited, whrend ersteres dies nicht tut.
Array.fromAsync(createAsyncIter(), (element) => element).then((array) =>
console.log(array),
);
// [1, 2, 3]
Array.fromAsync() wartet auf jeden Wert, der aus dem Objekt erzeugt wird, nacheinander. Promise.all() wartet auf alle Werte gleichzeitig.
function* makeIterableOfPromises() {
for (let i = 0; i < 5; i++) {
yield new Promise((resolve) => setTimeout(resolve, 100));
}
}
(async () => {
console.time("Array.fromAsync() time");
await Array.fromAsync(makeIterableOfPromises());
console.timeEnd("Array.fromAsync() time");
// Array.fromAsync() time: 503.610ms
console.time("Promise.all() time");
await Promise.all(makeIterableOfPromises());
console.timeEnd("Promise.all() time");
// Promise.all() time: 101.728ms
})();
hnlich wie bei for await...of, wenn das Objekt, das iteriert wird, ein synchrones Iterable ist und ein erzeugtes Promise abgelehnt wird, wird die Methode return() des zugrunde liegenden Iterators aufgerufen, falls vorhanden, um dem Iterator zu ermglichen, Bereinigungen vorzunehmen.
function* generatorWithRejectedPromises() {
try {
yield 0;
yield Promise.reject(new Error("error"));
} finally {
console.log("called finally");
}
}
(async () => {
try {
await Array.fromAsync(generatorWithRejectedPromises());
} catch (e) {
console.log("caught", e);
}
})();
// called finally
// caught Error: error
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-array.fromasync |
Array.fromAsync in core-jsArrayArray()Array.of()Array.from()for await...ofArrayat()concat()copyWithin()entries()every()fill()filter()find()findIndex()findLast()findLastIndex()flat()flatMap()forEach()includes()indexOf()join()keys()lastIndexOf()map()pop()push()reduce()reduceRight()reverse()shift()slice()some()sort()splice()toLocaleString()toReversed()toSorted()toSpliced()toString()unshift()values()with()[Symbol.iterator]()Object/FunctionDer Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |