2014-11-26 15 views
8

Sto utilizzando nodo v0.11.14-nightly-20140819-pre su Windows con flag harmony.Metodo oggetto con ES6/Bluebird promette

devo oggetto JavaScript con due metodi definiti nel suo prototipo:

function User (args) { 
    this.service= new Service(args); 
} 

User.prototype.method2 = function (response) { 
    console.log(this); // <= UNDEFINED!!!! 
}; 

User.prototype.method1 = function() { 
    ............. 
    this.service.serviceMethod(args) 
     .then(this.method2) 
     .catch(onRejected); 
}; 

function onRejected(val) { 
    console.log(val); 
} 

serviceMethod di Service oggetto restituisce una promessa.

quando uso User oggetto come il seguente:

let user = new User(args); 
user.method1(); 

this in method2 dell'oggetto User finisce undefined quando viene chiamato da then una volta promessa si compie.

Ho provato ad utilizzare sia Bluebird implementazione promessa ES6 e .

Perché this in questo caso è undefined?

risposta

12

Perché this in questo caso è undefined?

Poiché si passa una funzione, non un'istanza legata al metodo. Questo problema non è nemmeno-promessa specifico, vedere How to access the correct `this` context inside a callback? per la soluzione generica:

….then(this.method2.bind(this))… // ES5 .bind() Function method 

….then((r) => this.method2(r))… // ES6 arrow function 

Tuttavia, Bluebird does offer un altro modo per chiamare la funzione come un metodo:

this.service.serviceMethod(args) 
    .bind(this) 
    .then(this.method2) 
    .catch(onRejected); 
5

Vorrei aggiungere che questo è un problema generico di Javascript e può anche essere risolto utilizzando semplici funzioni javascript. Ad esempio, si potrebbe anche fare questo:

User.prototype.method1 = function() { 
    ............. 
    this.service.serviceMethod(args) 
     .then(this.method2.bind(this)) 
     .catch(onRejected); 
}; 

Questo utilizza Function.prototype.bind() che è integrato in Javascript e presente su ogni funzione. Questo crea una funzione di stub (che è ciò che viene passata al .then() e che stub ricollegare automaticamente il this valore desiderato prima di chiamare method2().

+1

questo è quello che ho finito per fare per mantenere le cose compatibili con ES6 promette – krl

+0

Ho finito per usare questo soluzione e sintassi di freccia grossa per i casi in cui avere un metodo prototipo separato era troppo prolisso. Credo che entrambi siano compatibili ES6 +. – Tom

Problemi correlati