Ho una classe javascript e ogni metodo restituisce una promessa Q
. Voglio sapere perché this
non è definito in method2
e method3
. C'è un modo più corretto per scrivere questo codice?Perché "questo" non è definito nel metodo di classe quando si utilizzano le promesse?
function MyClass(opts){
this.options = opts;
return this.method1()
.then(this.method2)
.then(this.method3);
}
MyClass.prototype.method1 = function(){
// ...q stuff...
console.log(this.options); // logs "opts" object
return deferred.promise;
};
MyClass.prototype.method2 = function(method1resolve){
// ...q stuff...
console.log(this); // logs undefined
return deferred.promise;
};
MyClass.prototype.method3 = function(method2resolve){
// ...q stuff...
console.log(this); // logs undefined
return deferred.promise;
};
posso risolvere questo problema utilizzando bind
:
function MyClass(opts){
this.options = opts;
return this.method1()
.then(this.method2.bind(this))
.then(this.method3.bind(this));
}
Ma non è del tutto sicuro perché bind
è necessario; è .then()
uccidendo this
off?
Quando si utilizza bind(), viene creata un'altra funzione con esattamente l'ambito che verrà passato dai parametri. Sebbene risponda solo alla tua ultima domanda, dai un'occhiata alla documentazione di Mozila: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Function/bind –
In 8 parole, spiega come the heck is [this] (http://stackoverflow.com/questions/34930771/why-is-this-undefined-inside-class-method-when-using-promises) un duplicato di [that] (http: // stackoverflow.com/questions/591269/settimeout-and-this-in-javascript)? Ho appena avuto questa stessa identica domanda venire, che sarebbe _non_ sono stati risposto [che] (http://stackoverflow.com/questions/591269/settimeout-and-this-in-javascript). Conosco [che] (http://stackoverflow.com/questions/591269/settimeout-and-this-in-javascript) già, ma vengo a patti con le promesse, le classi ES6 e "questo". – toszter
Sebbene sia strettamente correlato, questo non è un duplicato di questa domanda: http://stackoverflow.com/questions/591269/settimeout-and-this-in-javascript O è "Perché una mela cade da un albero?" un duplicato della domanda "Perché un castello di carte crolla quando inclino il tavolo su cui è costruito?"? – lex82