약속을 사용할 때 내부수업 방식이 정의되지 않은 이유는 무엇입니까?
자바스크립트 클래스가 있는데, 각각의 메소드는 a를 반환합니다.Q약속.난 이유를 알고 싶다.this정의되지 않음method2그리고.method3. 이 코드를 쓰는 더 정확한 방법이 있습니까?
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;
};
사용해서 고칠 수 있습니다.bind:
function MyClass(opts){
this.options = opts;
return this.method1()
.then(this.method2.bind(this))
.then(this.method3.bind(this));
}
하지만 그 이유를 완전히 확신할 수는 없습니다.bind필요하다; is.then()살생의this꺼졌다고요?
this는 항상 메서드가 호출되는 개체입니다.그러나 방법을 전달할 때then(), 당신은 그것을 부르는 것이 아닙니다!메소드는 어딘가에 저장되고 나중에 거기서 호출됩니다.보존하고 싶다면this, 다음과 같이 해야 합니다.
.then(() => this.method2())
또는 ES6 이전 방식으로 해야 하는 경우 보존해야 합니다.this이전:
var that = this;
// ...
.then(function() { that.method2() })
약속 처리기는 글로벌 개체의 컨텍스트에서 호출됩니다(window) 기본값입니다.엄밀 모드일 때(use strict;), 문맥은undefined. 이런 일이 발생하고 있는 겁니다method2그리고.method3.
;(function(){
'use strict'
Promise.resolve('foo').then(function(){console.log(this)}); // undefined
}());
;(function(){
Promise.resolve('foo').then(function(){console.log(this)}); // window
}());
위해서method1, 전화하시는군요method1~하듯이this.method1(). 이런 식으로 부르는 것은 그것을 그것의 맥락에서 부르는 것입니다.this당신의 인스턴스인 object.그래서 그 안의 맥락이method1예입니다.
기본적으로, 당신은 그것을 문맥 참조 없이 함수 참조로 전달하고 있습니다.this컨텍스트는 몇 가지 방법으로 결정됩니다.
- 은연중에.글로벌 함수 또는 바인딩이 없는 함수를 호출하는 것은 글로벌 컨텍스트를 가정합니다.*
- 직접적인 참조로.전화하면
myObj.f()그리고나서myObj가 될 것입니다.thiscontext.** - 수동 바인딩.이것은 다음과 같은 당신의 함수 클래스입니다.
.bind그리고..apply. 이것들은 당신이 명시적으로 말하는 것입니다.this맥락은.이는 항상 이전 두 가지보다 우선합니다.
예제에서는 함수 참조를 통과하고 있으므로 호출 시 전역 함수 또는 컨텍스트가 없는 함수로 암시됩니다.사용..bind를 사용하여 이 문제를 해결합니다.this가 명시적으로 설정되어 있습니다.
*이는 엄격하지 않은 모드에서만 해당됩니다.엄밀한 모드에서,this로 설정됩니다.undefined.
**사용 중인 기능이 수동으로 바인딩되지 않았다고 가정합니다.
단방향 함수가 컨텍스트를 얻습니다(this를 호출하는 개체에서 가져온 것입니다(이 때문에).method1적절한 맥락을 가지고 있습니다 - 그것은 실행됩니다.this함수 자체에 대한 참조를 에 전달하고 있습니다.then. 당신은 다음과 같은 구현을 상상할 수 있을 것입니다.then다음과 같이 보입니다.
function then( callback ) {
// assume 'value' is the recently-fulfilled promise value
callback(value);
}
그 예에서callback는 기능에 대한 참조입니다.어떤 맥락도 없습니다.이미 언급했듯이 함수를 전달하기 전에 컨텍스트에 바인딩하면 이 문제를 해결할 수 있습니다.
언급URL : https://stackoverflow.com/questions/34930771/why-is-this-undefined-inside-class-method-when-using-promises
'programing' 카테고리의 다른 글
| 서로 다른 ASP의 장단점.NET 캐싱 옵션 (0) | 2023.10.26 |
|---|---|
| MS-SQL에 SHA1()과 동등한 것이 있습니까? (0) | 2023.10.26 |
| PHP에서 Final을 언제 사용할 것인가요? (0) | 2023.10.26 |
| x86_64 va_list 구조의 형식은 무엇입니까? (0) | 2023.10.26 |
| JavaScript에서 프로토타입 상속 이해 (0) | 2023.10.26 |