2016-07-28 8 views
2

Dies ist wahrscheinlich etwas ein sehr kleines Problem, aber ich kann seine Lösung nicht finden, also bitte bitte mit mir!var wird undefined in Promise

Ich verstehe nicht, warum bei const body = ctx.request.body ctx nicht definiert wird. Bevor es this von der create()-Funktion übertragen hat, die createEntity() aufruft.

Was mache ich falsch?

Ich bin eine Funktion createEntity wie dieser Aufruf:

module.exports = { 
    createEntity:() => { 
    var ctx = this // both ctx and this are fine 
    return new Promise((resolve, reject) => { 
     const body = ctx.request.body // <-- ctx is undefined 
     resolve(); 
    }) 
    } 
} 

create() Anrufe createEntity(). Es ist eine Generatorfunktion mit co() über Koa.js gewickelt

create: function *() { 
    this.body = yield createEntity.call(this) 
} 

EDIT: Hier ein Screenshot, warum ich dachte this nach createEntity Aufruf in Ordnung ist: enter image description here

+2

Sie einen Pfeil Funktion verwenden, warum verwenden Sie einfach nicht 'const body = this.request.body'? – towerofnix

+0

Sie müssen es wie folgt schreiben: 'createInvoice() {...}' – vsync

+0

'this' wird falsch auf dem Screenshot ausgewertet, es sieht aus wie ein Jetpack Produkt Bug. – estus

Antwort

4

beide ctx und diese sind in Ordnung

bezweifle ich. Sie verwenden eine Pfeilfunktion. Sie können nicht ein Pfeil Funktion this über call eingestellt, da ein Pfeil nicht über eine eigene this .

Verwenden Sie stattdessen eine normale Funktion.

Siehe auch Arrow function vs function declaration/expressions: Are they equivalent/exchangeable?


1: this innen createEntity auf der obersten Ebene this des Moduls, die module.exports wird, bezieht sich: auf createEntity

this;  // <------------| 
module.exports = {   | 
    createEntity:() => {  | 
    var ctx = this  // ---| 
    } 
} 
console.log(this === module.exports); // true 
+0

Ja, das war ein dummer Fehler. Bitte schau dir meinen Screenshot in der Originalfrage an, warum ich dachte, das wäre in Ordnung. – Hedge

+0

Objekt bedeutet nicht, dass sie gleich sind. Wenn Sie var object = {} haben, ist es auch ein Objekt, aber es enthält nichts – LuisPinto

1

Durch die Zuordnung einer Pfeilfunktion, this inside the arrow function wird dem Wert this in dem Bereich zugewiesen, in dem die Pfeilfunktion deklariert wurde, w hich ist wahrscheinlich das globale Objekt (also wenn Sie use strict verwenden, this wird undefined sein), und es wird auch so bleiben, auch wenn Sie die Funktion aufrufen, indem call.

eine gemeinsame Funktion Ausdruck Verwenden Sie stattdessen

createEntity: function() { 
    ... 
}