2013-02-28 5 views
0

this question과 관련하여 콜백을 추가하여 데이터를 다시 가져 오려고합니다. 그래서 나는이 시도 :자바의 재귀 비동기 콜백

Uncaught TypeError: Object [object Window] has no method 'callback' 

: 나는 이전 질문 후 폐쇄의 더 나은 이해를하지만 난 ... 나는 다음과 같은 오류가있어하지 않는 것 같아요 생각

var subgroupIds = []; 
var that = this; 
this.getSubGroups = function (groupId,callback) { 
    var anotherObject = this; 
    this.getGroups("groupId="+groupId, function(groups) { 
     if ($.isEmptyObject(groups)) { 
      return; 
     } else { 
      $.each(groups, function(index,group) { 
       subgroupIds.push(group.id); 
       that.getSubGroups(group.id); 
      }); 
      anotherObject.callback(group.id); 
     } 
    }); 
} 

여기서 내가 뭘 잘못하고 있니?

편집

여기에 기능 getgroups의 내용이다 :

this.getGroups = function(filter,callback,error_callback) { 
    this.getJSON('/'+apiVersion+'/groups/',function(data){ 
     // run through the filter engine 
     output = runFilter(data, filter); 
     callback(output); 
    },error_callback); 
} 
+0

'this.getGroups'는 (는)'anotherObject.getGroups'이어야합니까? –

+0

왜'that' 대신'anotherObject'를 사용합니까? 그리고 왜 당신은 속성에 콜백합니까, 당신은 함수 인자를 콜백하고 싶지 않습니까? – Bergi

+0

'this' /'that'은 무엇입니까? 'this.getSubGroups'를 선언 할 때,'this'는'window'를 가리 킵니다. 그래서'this'가 올바른 것을 참조하도록하기 위해 뭔가를하지는 않을 것입니다. 그러면 'anotherObject'는 똑같은'window'를 참조합니다. 또한, 왜 당신은'anotherObject.callback (group.id)'를 사용하려고합니까? 'callback (group.id);를 원합니까? – Ian

답변

1

그렇지 않은 : 당신은 단지 콜백을 실행하려면, 당신은 폐쇄를 사용하려는 경우

$.proxy(callback, anotherObject)(group.id); 

또는 추가 필요 anotherObject.callback(group.id); 할 필요가, 당신이 필요로하는 무엇을 arguments 개체 this을 혼동하고 마치 callback(group.id);

입니다.

arguments

함수로 전달되는 모든 매개 변수를 보유 : 기본적으로 (대략 점 이전에 될 일이 무엇이든, 말하기,이다) 함수의 "주인"을 의미

var aFunction = function() { 
    for (var i = 0; i < arguments.length; i++) { 
     console.log(arguments[i]); 
    } 
}; 

aFunction(1, 2, 3, 4); // 1, 2, 3, 4 

this 동안 :

var aFunction = function() { 
    console.log(this); 
}; 

var object1 = { f: aFunction, name: "object1" }; 
var object2 = { f: aFunction, name: "object2" }; 

object1.f(); // Object { name="object1", f=function()} 
object2.f(); // Object { name="object2", f=function()} 
aFunction(); // Window 
+0

나는 당신이 말하는 것을 이해합니다. 나는'callback'이'getSubGroups'의 인자이고'getGroups'가'callback'을 보지 못했다고 생각했습니다. 다른 레벨이 내려 갔기 때문입니다. anotherObject 변경 시도했다.uncaught TypeError : undefined가 함수가 아닙니다' – PLui

+0

@PLui 그 이유는'that.getSubGroups()에 대한 재귀 호출이 있기 때문입니다. 콜백 (group.id) group.id);'- 두번째 매개 변수 인 콜백 (callback)을 제공하지 않습니다. 이것이 왜'undefined '입니까? 함수를 호출 할 때마다 콜백을 제공하거나 수표를 사용해야합니다. if (callback) {callback (group.id); }' –

+0

모든 재귀 호출에서 동일한 콜백을 호출하려면 다음을 수행하면됩니다.'that.getSubGroups (group.id, callback); ' –

0

콜백은 매개 변수, 그것은 문맥에 바인드되지 않습니다.

내가 원하는 것은 anotherObject으로 콜백을 this 값으로 호출하는 것입니다. 맞습니까?

당신이 것을 얻을 수 있습니다

this.callback = callback; //before 
var anotherObject = this; 
+0

그 프록시 물건으로'callback.call (anotherobject, group.id)'를 의미합니까? – Bergi