Tôi có lớp javascript và mỗi phương thức trả về lời hứa Q
. Tôi muốn biết lý do tại sao this
không được xác định trong method2
và method3
. Có cách nào chính xác hơn để viết mã này không?Tại sao 'này' không xác định phương thức lớp bên trong khi sử dụng lời hứa?
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;
};
tôi có thể khắc phục điều này bằng cách sử dụng bind
:
function MyClass(opts){
this.options = opts;
return this.method1()
.then(this.method2.bind(this))
.then(this.method3.bind(this));
}
Nhưng không hoàn toàn chắc chắn lý do tại sao bind
là cần thiết; bị cắt .then()
giết this
?
Khi bạn sử dụng bind() nó tạo ra một hàm khác với phạm vi chính xác mà bạn sẽ vượt qua bằng tham số. Mặc dù câu trả lời chỉ là câu hỏi cuối cùng của bạn, hãy xem tài liệu của Mozila: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Function/bind –
Trong 8 từ, hãy giải thích cách heck là [this] (http://stackoverflow.com/questions/34930771/why-is-this-undefined-inside-class-method-when-using-promises) một bản sao của [that] (http: // stackoverflow.com/questions/591269/settimeout-and-this-in-javascript)? Tôi vừa có câu hỏi tương tự chính xác này, câu trả lời sẽ được trả lời bởi [rằng] (http://stackoverflow.com/questions/591269/settimeout-and-this-in-javascript). Tôi biết [rằng] (http://stackoverflow.com/questions/591269/settimeout-and-this-in-javascript) đã có, nhưng tôi đang đến với các điều khoản với lời hứa, ES6 Classes, và 'this'. – toszter
Mặc dù nó liên quan chặt chẽ, nhưng đây không phải là một bản sao của câu hỏi này: http://stackoverflow.com/questions/591269/settimeout-and-this-in-javascript Hoặc là "Tại sao một quả táo rơi ra khỏi cây?" một bản sao của câu hỏi "Tại sao một ngôi nhà của thẻ sụp đổ khi tôi nghiêng bàn của nó được xây dựng trên?"? – lex82