2016-12-08 1 views
2

Immer wenn ich versuche, auf this innerhalb Ramda Compose Funktion zuzugreifen (R.compose) bekomme ich undefined, vielleicht liegt es daran, this ist 'gebunden' an die Ramda Compose-Funktion.Wie kann ich auf Konstruktor "dieses" in Ramda zugreifen?

Wie kann ich this Zugriff auf etwas, das im Class Konstruktor initiiert wird machen?

this.state innerhalb getContent im Code unten undefined:

export default class FaqStore { 
    constructor() { 
    this.state = new FaqState() 

    this.getParents() 
    } 

    getContent = R.concat(this.state.parents, R.prop('content')) 
    getParents = FaqService.getParents().then(this.getContent) 
+3

Welche Syntax ist das? Der Code ist unvollständig und sieht nicht wie ES6 aus. Wenn Sie den Vorschlag für öffentliche Klasseneigenschaften verwenden, wird 'R.concat (this.state.parents, R.prop ('content'))' wahrscheinlich ausgewertet, bevor Sie 'this.state' setzen. Lösung: Verschieben Sie die Zuweisung "getContent" und "getParents" in den Konstruktor, nachdem Sie 'this.state' zugewiesen haben. –

Antwort

3

Es scheint, wie Sie die öffentlichen Klassenfelder Vorschläge verwenden. Auf diese Weise erstellte Eigenschaften sind evaluated before the constructor itself is executed (Schritt 8 und 11).

I.e. Ihr Code zu

export default class FaqStore { 
    constructor() { 
    this.getContent = R.concat(this.state.parents, R.prop('content')) 
    this.getParents = FaqService.getParents().then(this.getContent) 

    this.state = new FaqState() 

    this.getParents() 
    } 
} 

Äquivalent Dies zeigt deutlich, dass Sie this.state zuzugreifen, bevor es initialisiert wurde versuchen.

Mögliche Lösung

den Vorschlag nicht verwenden Sie und die Eigenschaften direkt im Konstruktor gesetzt, nach Sie this.state initialisiert:

export default class FaqStore { 
    constructor() { 
    this.state = new FaqState() 

    this.getContent = R.concat(this.state.parents, R.prop('content')) 
    this.getParents = FaqService.getParents().then(this.getContent) 

    this.getParents() 
    } 
} 

jedoch gibt es immer noch ein Problem: Der Wert getParents ist ein Versprechen. Sie können nicht ein Versprechen (this.getParents()) aufrufen. Vielleicht ist das, was Sie wirklich wollen, eine Funktion zu getParents zuzuweisen:

this.getParents =() => FaqService.getParents().then(this.getContent) 

Und vielleicht R.concat keine Funktion entweder zurückgeben, wobei in diesem Fall this.getContent kann auch nicht genannt werden. In diesem Fall wollen, was Sie eigentlich ist

export default class FaqStore { 
    constructor() { 
    this.state = new FaqState() 

    this.getParents() 
    } 

    getContent =() => R.concat(this.state.parents, R.prop('content')) 
    getParents =() => FaqService.getParents().then(this.getContent) 
} 

heißt Funktionen-getContent und getParents zuweisen.

+0

['R.concat (..., ...)'] (http://ramdajs.com/docs/#concat) * bestimmt * gibt keine Funktion zurück :-) Ich denke, OP bedeutete 'R.compose (R.concat (this.state.parents), R.prop ('content')) ' – Bergi

+0

@Bergi: Ich habe nicht gesucht;) Danke! –

5

Die Antwort von Felix Kling ist ausgezeichnet. Ich möchte jedoch etwas mehr Kontext von Ramda hinzufügen.

Ramda (Disclaimer: Ich bin einer der Autoren) ist über funktionale Programmierung. Es versucht zwei Dinge zu tun: Es soll Javascript-Entwicklern den Weg zu Standard-FP-Praktiken erleichtern und es den Benutzern von FP-Sprachen erleichtern, mit Javascript zu arbeiten. Es gibt keinerlei Betonung auf Interoperabilität mit objektorientierten Codierungsstilen.

An einem Punkt versuchte Ramda sicherzustellen, dass bestimmte seiner Funktionen den this Kontext beibehalten, der es ihnen ermöglichen würde, als OOP-Methoden verwendet zu werden. Aber wir lassen diesen Fokus völlig fallen; es war immer spekulativ gewesen, ohne irgendwelche Anfragen dafür, und als wir es versehentlich für einige Funktionen gebrochen hatten, hatten wir überhaupt keine Beschwerden. Es scheint wenig Grund dafür zu geben. Inzwischen erschwert es unsere Implementierung und beeinträchtigt die Leistung.Wenn wir also die Notwendigkeit finden, Funktionen neu zu schreiben, versuchen wir nicht mehr sicherzustellen, dass dies beibehalten wird.

Dies ist sinnvoll. Einige Leute sehen Ramda als Alternative zu Underscore oder Lodash, aber das schien uns immer schief zu stehen. Diese Bibliotheken stellen einige FP-Konzepte vor, sind jedoch so konzipiert, dass sie in Umgebungen mit mehreren Paradigmen arbeiten können, die gleichermaßen mit Imperativ-, OOP- oder FP-Codebasen zufrieden sind. Ramda ist anders, entworfen, um nur in funktionalen Systemen gut zu funktionieren. Es basiert vollständig auf der Idee, Systeme zu bauen, indem reine Funktionen zusammengesetzt werden.

Aus diesen Gründen, oben auf alles, sagte Felix, es gibt keinen wirklichen Grund zu erwarten, dass eine Ramda-Funktion Ihren this Kontext aufrechterhalten wird.

Verwandte Themen