Promise[Symbol.species]

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die statische Zugriffsoroperty Promise[Symbol.species] gibt den Konstruktor zurück, der verwendet wird, um Rückgabewerte aus Promise-Methoden zu konstruieren.

Warnung: Die Existenz von [Symbol.species] ermöglicht die Ausführung von beliebigem Code und kann Sicherheitslücken schaffen. Sie erschwert auch bestimmte Optimierungen. Implementierer von Engines untersuchen derzeit, ob dieses Feature entfernt werden sollte. Vermeiden Sie es, sich darauf zu verlassen, wenn möglich.

Syntax

js
Promise[Symbol.species]

Rückgabewert

Der Wert des Konstruktors (this), auf dem get [Symbol.species] aufgerufen wurde. Der Rückgabewert wird verwendet, um Rückgabewerte von Promise-Verkettungsmethoden zu konstruieren, die neue Promises erstellen.

Beschreibung

Die [Symbol.species] Accessor-Property gibt den Standardkonstruktor für Promise-Objekte zurück. Unterklassenspezifische Konstruktoren können diese überschreiben, um die Konstruktorzuweisung zu ändern. Die Standardimplementierung ist im Wesentlichen:

js
// Hypothetical underlying implementation for illustration
class Promise {
  static get [Symbol.species]() {
    return this;
  }
}

Aufgrund dieser polymorphen Implementierung würde [Symbol.species] von abgeleiteten Unterklassen standardmäßig auch den Konstruktor selbst zurückgeben.

js
class SubPromise extends Promise {}
SubPromise[Symbol.species] === SubPromise; // true

Promise-Verkettungsmethoden — then(), catch() und finally() — geben neue Promise-Objekte zurück. Sie erhalten den Konstruktor, um das neue Promise über this.constructor[Symbol.species] zu konstruieren. Wenn this.constructor undefined ist oder this.constructor[Symbol.species] undefined oder null ist, wird der Standardkonstruktor Promise() verwendet. Andernfalls wird der Konstruktor verwendet, der von this.constructor[Symbol.species] zurückgegeben wird, um das neue Promise-Objekt zu konstruieren.

Beispiele

Species in gewöhnlichen Objekten

Die Symbol.species-Property gibt die Standardkonstruktorfunktion zurück, die der Promise-Konstruktor für Promise ist.

js
Promise[Symbol.species]; // [Function: Promise]

Species in abgeleiteten Objekten

In einer Instanz einer benutzerdefinierten Promise-Unterklasse, wie MyPromise, ist die MyPromise-Spezies der MyPromise-Konstruktor. Sie könnten diesen jedoch überschreiben wollen, um in Ihren abgeleiteten Klassenmethoden Eltern-Promise-Objekte zurückzugeben.

js
class MyPromise extends Promise {
  // Override MyPromise species to the parent Promise constructor
  static get [Symbol.species]() {
    return Promise;
  }
}

Standardmäßig würden Promise-Methoden Promises mit dem Typ der Unterklasse zurückgeben.

js
class MyPromise extends Promise {
  someValue = 1;
}

console.log(MyPromise.resolve(1).then(() => {}).someValue); // 1

Durch das Überschreiben von [Symbol.species] geben die Promise-Methoden den Basistyp Promise zurück.

js
class MyPromise extends Promise {
  someValue = 1;
  static get [Symbol.species]() {
    return Promise;
  }
}

console.log(MyPromise.resolve(1).then(() => {}).someValue); // undefined

Spezifikationen

Specification
ECMAScript Language Specification
# sec-get-promise-%symbol.species%

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch