1

我想在 javascript 中创建一个 API 系统(在单个对象内),所有这些都源于 jQuery 的 ajax 函数,但我希望能够传递一个覆盖“成功”函数来触发,如下所示:

function Eidos(){

    this.api = function(data, success){
        $.ajax({
            type: 'POST', 
            url: '/api',
            data: data,
            success: function(rData){
                return rData;
            }
        })
    };

    this.refreshInfo = function(id, success){
            log.info('refreshed page id:  '+ id);
            return this.api({'command': 'refresh', 'pageid': id}, success);
    }


};

在这个例子中,我只想“刷新”信息(拉入新的文本数据或你有什么)。我已经有一个服务器端页面设置。

我会这样称呼它:

$('.refresh').click(function(){
        $("#myModal").modal('show');
        var id = $(this).data('ei');
        var api = eidos.refreshInfo(id, function(){
                $("#myModal").modal('hide');
                });
        return false;
    });

显然这不起作用(顺便说一句,对象已经通过 var eidos = new Eidos(); 创建),但是,Idk 如何实现它。我希望成功:函数在不同页面上表现不同,所以我需要一个覆盖,但我不知道如何在这里工作。

4

5 回答 5

4

尝试改变

success: function(rData){
   return rData;
}

success: success

您当前没有调用(甚至没有使用)该success参数。

于 2012-08-30T13:22:01.047 回答
2
        success: function(rData){
            return rData;
        }

是问题所在。你已经有一个回调函数的参数,所以使用它:

        success: function(rData) {
            success(rData);
        }

或者,为了缩短它,将回调函数作为参数直接传递到 jQuery ajax 中。

于 2012-08-30T13:23:23.917 回答
1

您正在进行异步调用,并且您的行为就像它是同步的一样。您不能从异步调用返回并期望它将数据返回到调用它的位置。

this.api = function(data, success){
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: function(rData){
            return rData;  //<-- That return is not going to work
        }
    })
};

如果你想传入一个回调,而不是分配它。

this.api = function(data, success){
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: success
        }
    })
};

或称它为

this.api = function(data, success){
    var that = this;
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: function(rData){
            success(); //<-- call it or you can use apply/call
            //success.apply(that,arguments);
            return rData;  //<-- That return is not going to work
        }
    })
};
于 2012-08-30T13:22:43.870 回答
1

您没有在success任何地方使用回调。

this.api = function(data, success){
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: success || function(rData) {
            // some default handler to use if none is passed
        }
    })
};

允许您的success: success || function(rData) {成功参数是可选的;如果没有通过,它将使用您指定的默认处理程序。

于 2012-08-30T13:32:22.517 回答
0

想到这一点的方法是 JQuery ajax 函数在触发时将 rData 传递给您的函数。rData 将简单地返回 jQuery 内部的封闭范围内的某个地方,您没有任何控制权,因此使用它做某事的地方在该成功函数内。

或者您可以通过另一个事件向外部事物发出信号:

//...
    success:function(rData){
        $(someOtherObject).trigger({type:'rDataDelievered', successData:rData});
    }
}

someOtherObject.bind('rDataDelivered', function(e){ doSomething(e.successData); });

它不是一个频繁使用的功能,但是是的,您可以动态定义一个新事件并使用 jQuery 在任何您想要的东西上触发它。如果您没有传递 rData 对象,trigger('rDataDelivered')那么对于一个简单的信号就足够了。但是这里有相当多的冗余。如果没有什么能阻止您,最好在成功功能中使用适当的 ajax 事件来执行此操作。

于 2012-08-30T13:34:59.430 回答