Javascript中的递归异步回调

时间:2013-02-28 14:32:50

标签: javascript recursion callback closures

关于this question,我正在尝试添加回调以获取数据。所以我尝试了这个:

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);
        }
     });
}

我认为在上一个问题之后我对封闭有了更好的理解,但我想我没有...我收到了以下错误:

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

我在这里做错了什么?

修改

以下是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);
}

2 个答案:

答案 0 :(得分:1)

不需要anotherObject.callback(group.id);,您需要的是callback(group.id);

看起来您将thisarguments对象混淆。

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

答案 1 :(得分:0)

回调是一个参数,它没有绑定到上下文。

我认为你想要的是用anotherObject作为this来调用回调,对吗?

您可以通过以下方式实现这一目标:

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

或者,如果您只想执行回调,并且想要使用闭包,则需要添加:

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