은 제가 생산이 쓰레기 처리 도와주세요 리소스 로더에서 콜백 지옥 :WebGL을 :
Program.prototype.init = function()
{
loadText('../res/shaders/blinnPhong-shader.vsh', function (vshErr, vshText) {
if (vshErr) {
alert('Fatal error loading vertex shader.');
console.error(vshErr);
} else {
loadText('../res/shaders/blinnPhong-shader.fsh', function (fshErr, fshText) {
if (fshErr) {
alert('Fatal error loading fragment shader.');
console.error(fshErr);
} else {
loadJSON('../res/models/dragon.json', function (modelErr, modelObj) {
if (modelErr) {
alert('Fatal error loading model.');
console.error(modelErr);
} else {
loadImage('../res/textures/susanTexture.png', function (imgErr, img) {
if (imgErr) {
alert('Fatal error loading texture.');
console(imgErr);
} else {
this.run = true;
RunProgram(vshText, fshText, img, modelObj);
}
});
}
});
}
});
}
});
};
내 실제 목표는 WebGL이 프로그램에 대한 추상적 인 자원로드 프로세스이다. 즉, 메시, 텍스처, 쉐이더 배열이있을 것이며, 리소스간에 특정 종속성을 연결할 수 있기를 바랍니다. 예 : 두 개의 GameObjects One과 Two를 만들고 싶습니다. 하나는 셰이더를 사용하고 메쉬에서로드되지만 텍스처가없는 반면 2는 동일한 셰이더를 One로 사용하지만 자체 메쉬를 사용하며 텍스처가 필요합니다. JavaScript (비동기 적재 등)에서 이러한 종속성을 구축하기 위해 어떤 원칙을 사용할 수 있습니까?
편집 : 그래서이 코드에서 다음과 같은 현상이 발생합니다. 현재 콜백을 유지했습니다. 그러나이 메서드는 Singleton 개체의 일부입니다. 나는 마지막으로 다른 경우에 프로그램의 플래그를 true로 설정하기 때문에 코드를 편집했습니다. 내 메인에 프로그램 개체의 글로벌 참조를 유지합니다. 그러나 콜백으로 인해 참조가 어떻게 든 손실되며 전역 참조는 플래그를 false로 유지하므로 기본 루프에는 도달하지 않습니다. 중첩 콜백 바깥에서 "this.run = true"를 호출하면 플래그가 설정되므로 분명히 콜백의 문제점입니다. 그것에 대한 조언이 있습니까?
첫 번째 조언은 질문을 업데이트하지 않고 응답을받은 후에 범위를 변경하는 것입니다. 동료 개발자가 검색 엔진을 통해 질문을 찾는 것과 마찬가지로 질문이 많은 것입니다. 둘째 [이 대답 읽기] (https://stackoverflow.com/a/500459/978057), 세 번째는 주어진 답변 중 하나를 수락하는 것입니다.) –
TLDR은 'this'는 함수의 범위를 나타냅니다 현재 콜드 백에 대한 콜백을 ['bind']해야합니다 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind). 원래 스코프를 저장하거나 Program.Init 메소드의 맨 위에'this'에 대한 참조를 저장하고 더 깊게 스택을 사용하십시오. –