2

Ich habe gerade begonnen zu experimentieren mit Klassen und Async erwarten. Ich benutze Knoten Version 8.9.0 (LTS). Wenn ich console.log(this), bekomme ich undefined anstelle der Referenz auf das Objekt.Ein undefiniertes "this" bei Verwendung von Klassen/Async erwarte

subhandler.js

class Handler { 
    constructor(props) { 
    this.defaultRes = { 
     data: successMessage, 
     statusCode: 200 
    }; 
    } 

    async respond(handler, reply, response = this.defaultRes) { 
    console.log(this); // why is `this` undefined???? 
    try { 
     await handler; 
     return reply(response.data).code(response.statusCode) 
    } catch(error) { 
     return reply(error); 
    } 
    } 
} 

class SubHandler extends Handler { 
    constructor(props) { 
    super(props); 
    this.something = 'else'; 
    } 

    makeRequest(request, reply) { 
    console.log(this); // why is `this` undefined!! 
    // in this case, doSomeAsyncRequest is a promise 
    const handler = doSomeAsyncRequest.make(request.params); 
    super.respond(handler, reply, response); 
    } 
} 

module.exports = new SubHandler; 

Innen Hapi Strecke

const SubHandler = require('./subhandler'); 

server.route({ 
    method: 'GET', 
    path: '/', 
    handler: SubHandler.makeRequest, 
    // handler: function (request, reply) { 
    // reply('Hello!'); //leaving here to show example 
    //} 
}); 

Prototype Beispiel

function Example() { 
    this.a = 'a'; 
    this.b = 'b'; 
} 

Example.prototype.fn = function() { 
    console.log(this); // this works here 
} 

const ex = new Example(); 
ex.fn(); 
+0

Wie rufen Sie 'makeRequest'? – Timo

+0

Es wird von einem Hapi-Route-Handler aufgerufen https://hapijs.com/tutorials/routing – cusejuice

+0

Für diese Art von Problem, gibt es in der Regel eine '. Bind (This)' in den Anruf fehlt. –

Antwort

3

Wenn y ou wollen this immer in makeRequest auf die Instanz verweisen, bind its context im Konstruktor:

class SubHandler extends Handler { 
    constructor(props) { 
    super(props); 

    this.makeRequest = this.makeRequest.bind(this) 

    this.something = 'else'; 
    } 

    makeRequest(request, reply) { 
    console.log(this); 
    const handler = doSomeAsyncRequest.make(request.params); 
    super.respond(handler, reply, response); 
    } 
} 
+0

Hm, das funktioniert, aber fehlt mir hier etwas? Ich dachte mir, dass dies mit dem neuen ES6-Klassenschlüsselwort out-of-the-box funktionieren würde. Also, im Grunde, für alle Methoden der Klasse, um einen Verweis auf "das" zu bekommen, müsste ich seinen Kontext im Konstruktor binden ?? Scheint ungerade – cusejuice

+2

Nein, Klassen nicht automatisch ihre Mitgliedsfunktionen in JavaScript. – Timo

+2

'Klasse' ist meist nur syntaktischer Zucker über die prototypbasierte Vererbung, die JS seit Ewigkeiten hat. 'Diese' Semantik und das meiste andere Verhalten ist immer noch dasselbe. – noppa

Verwandte Themen